distillery 0.2.10 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/Guardfile CHANGED
@@ -1,4 +1,4 @@
1
- guard 'rspec' do
1
+ guard 'rspec', :cli => '-d' do
2
2
  watch(%r{^spec/.+_spec\.rb})
3
3
  watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
4
  watch('spec/spec_helper.rb') { "spec" }
@@ -11,7 +11,7 @@ module Distillery
11
11
  UNLIKELY_TAGS = %w[head script link meta]
12
12
 
13
13
  # HTML ids and classes that are unlikely to contain the content element.
14
- UNLIKELY_IDENTIFIERS = /combx|comment|disqus|foot|header|meta|nav|rss|shoutbox|sidebar|sponsor/i
14
+ UNLIKELY_IDENTIFIERS = /combx|comment|community|disqus|extra|foot|header|remark|rss|shoutbox|sidebar|sponsor|ad-break|agegate|pagination|pager|popup/i
15
15
 
16
16
  # Elements that are whitelisted from being removed as unlikely elements
17
17
  REMOVAL_WHITELIST = %w[a body]
@@ -36,6 +36,9 @@ module Distillery
36
36
  # needs to have in order to be considered related.
37
37
  RELATED_SCORE_RATIO = 0.045
38
38
 
39
+ # The prioritization level given to elements higher in the DOM
40
+ DOM_PRIORITIZATION = 25
41
+
39
42
  # The Nokogiri document
40
43
  attr_reader :doc
41
44
 
@@ -93,6 +96,7 @@ module Distillery
93
96
  end
94
97
 
95
98
  augment_scores_by_link_weight!
99
+ augment_scores_by_dom_depth!
96
100
  end
97
101
 
98
102
  # Distills the document down to just its content.
@@ -147,9 +151,17 @@ module Distillery
147
151
  end
148
152
  end
149
153
 
154
+ def augment_scores_by_dom_depth!
155
+ scores.each do |xpath, points|
156
+ factor = DOM_PRIORITIZATION - (xpath.split('/').length * 2)
157
+ scores[xpath] = scores[xpath] * factor
158
+ end
159
+ end
160
+
150
161
  def link_density(elem)
151
162
  link_length = elem.search('a').reduce(0) { |total, e| total + e.text.length }
152
- total_length = [elem.text.length, 1].max # Protect against dividing by 0
163
+ collapsed_text = elem.text.gsub(/\W{3,}/, '') # remove excess whitespace
164
+ total_length = [collapsed_text.length, 1].max # Protect against dividing by 0
153
165
  link_length.to_f / total_length.to_f
154
166
  end
155
167
 
@@ -232,7 +244,7 @@ module Distillery
232
244
  elem.text.empty? || # Empty text
233
245
  (!is_anchor && elem.text.length < 15) || # Short text and not a link
234
246
  img > p || # More images than paragraphs
235
- li > p && !(elem.name =~ /ul|ol/) || # Has lots of list items
247
+ li > p && link_density > 0.2 || # Has lots of list items and moderate link density
236
248
  input > p / 3 || # Has a high % of inputs
237
249
  weight < 25 && link_density > 0.2 || # Weak content signal and moderate link density
238
250
  weight >= 25 && link_density > 0.5 # Strong content signal and high link density
@@ -1,3 +1,3 @@
1
1
  module Distillery
2
- VERSION = "0.2.10"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -1,13 +1,18 @@
1
1
  require 'spec_helper'
2
+ require 'iconv'
2
3
 
3
4
  def distillation_of(filename, options = {}, &block)
4
5
 
5
6
  describe "distillation of #{filename}" do
6
7
 
7
- let(:fixture) do
8
+ let(:raw_fixture_data) do
8
9
  File.read(File.join(File.dirname(__FILE__), 'fixtures', filename))
9
10
  end
10
11
 
12
+ let(:fixture) {
13
+ Iconv.new('UTF-8//IGNORE', 'UTF-8').iconv(raw_fixture_data + ' ')[0..-2]
14
+ }
15
+
11
16
  subject { Distillery::Document.new(fixture).distill!(options) }
12
17
 
13
18
  it 'should include the right elements' do
@@ -126,7 +131,7 @@ distillation_of 'bourbon_balls.html' do
126
131
  end
127
132
 
128
133
  distillation_of 'bulgogi.html' do
129
- subject.slice(0..100).should include('looking to create a menu')
134
+ subject.slice(0..1700).should include('looking to create a menu')
130
135
  subject.scan(/American to not fuss about the origin/).should have(1).result
131
136
  should =~ /early-season barbecue/
132
137
  should =~ /Still, it is American to not fuss/
@@ -168,4 +173,24 @@ distillation_of 'maple_cookies.html', images: true do
168
173
  subject.should =~ %r|http://farm8.staticflickr.com/7175/6466771851_a9a82d1ddc.jpg|
169
174
  subject.should =~ %r|http://farm8.staticflickr.com/7014/6466788173_1898db6772.jpg|
170
175
  subject.should =~ %r|http://farm8.staticflickr.com/7006/6466777445_c9661aae40.jpg|
176
+ end
177
+
178
+ distillation_of 'swiss_chard_pie.html', images: true do
179
+ subject.should =~ /You may be familiar with Spanakopita/
180
+ subject.should =~ /Bring a large pot of generously salted/
181
+ subject.should =~ /for 10 to 20 minutes./
182
+ end
183
+
184
+ distillation_of 'mothers_brisket.html' do
185
+ subject.should =~ /Prep time: /
186
+ subject.should =~ /onions until deep golden/
187
+ subject.should =~ /3 tablespoons.+vegetable oil/
188
+ subject.should =~ /Preheat the oven to 375/
189
+ subject.should =~ /oven for about 30 minutes/
190
+ end
191
+
192
+ distillation_of 'oyako.html' do
193
+ subject.should =~ /Ingredients:/
194
+ subject.should =~ /4 servings/
195
+ subject.should =~ /Goes well with a clear soup/
171
196
  end
@@ -0,0 +1,926 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" id="sixapart-standard">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6
+ <link rel="shortcut icon" href="http://americanpublicmedia.publicradio.org/favicon.ico" />
7
+ <link rel="stylesheet" type="text/css" href="http://americanpublicmedia.publicradio.org/cobrand/standard/css/apm002/apm.css" media="all" />
8
+ <link rel="stylesheet" type="text/css" href="http://splendidtable.publicradio.org/standard/css/st003/global.css" media="all" />
9
+ <!--[if lte IE 7]>
10
+ <link rel="stylesheet" type="text/css" href="http://splendidtable.publicradio.org/standard/css/st003/ie_lte7.css" media="all" />
11
+ <![endif]-->
12
+ <!--[if IE 8]>
13
+ <link rel="stylesheet" type="text/css" href="http://splendidtable.publicradio.org/standard/css/st003/ie_8.css" media="all" />
14
+ <![endif]-->
15
+ <link href='http://fonts.googleapis.com/css?family=Crimson+Text&amp;subset=latin' rel='stylesheet' type='text/css' />
16
+ <link id="printLink" rel="stylesheet" href="http://splendidtable.publicradio.org/standard/css/st003/printLarge.css" media="print" type="text/css" />
17
+ <script type="text/javascript" src="http://splendidtable.publicradio.org/standard/js/printRecipe.js"></script>
18
+
19
+
20
+
21
+ <script type="text/javascript" language="JavaScript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
22
+ <script type="text/javascript" language="JavaScript" src="http://www.publicradio.org/config/cobrand/standard/js/apm002/apmHdrFtr.js"></script>
23
+ <script type="text/javascript" language="JavaScript" src="http://splendidtable.publicradio.org/standard/js/st003/jquery.innerfade.js"></script>
24
+ <script type="text/javascript" language="JavaScript" src="http://splendidtable.publicradio.org/standard/js/st003/jquery.easing.1.3.js"></script>
25
+ <script type="text/javascript" language="JavaScript" src="http://splendidtable.publicradio.org/standard/js/st003/jquery.cycle.min.js"></script>
26
+
27
+ <script type="text/javascript" language="JavaScript" src="http://splendidtable.publicradio.org/standard/js/st003/stprint.js"></script>
28
+
29
+ <script type="text/javascript" language="JavaScript" src="http://splendidtable.publicradio.org/standard/js/st003/global.js"></script>
30
+ <script type="text/javascript" language="JavaScript" >
31
+
32
+ $(document).ready(function() {
33
+ $( ".printCompactVersion" ).click(function() {
34
+ $("link#printLink").attr("href", "http://splendidtable.publicradio.org/standard/css/st003/printCompact.css");
35
+ return false;
36
+ });
37
+ $( ".printRegularVersion" ).click(function() {
38
+ $("link#printLink").attr("href", "http://splendidtable.publicradio.org/standard/css/st003/printLarge.css");
39
+ return false;
40
+ });
41
+ });
42
+
43
+ </script>
44
+
45
+ <link rel="stylesheet" href="http://splendidtable.publicradio.org/standard/css/st003/handheld.css" media="only screen and (min-device-width : 320px) and (max-device-width : 480px), only screen and (min-device-width : 768px) and (max-device-width : 1024px)">
46
+
47
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
48
+
49
+
50
+ <link rel="start" href="http://www.publicradio.org/columns/splendid-table/recipes/" title="Recipe Home" />
51
+ <link rel="alternate" type="application/atom+xml" title="Recipes" href="http://feeds.americanpublicmedia.org/SplendidTableRecipes" />
52
+
53
+ <link rel="prev bookmark" href="http://www.publicradio.org/columns/splendid-table/recipes/caramelized_catfish_sand_pot.html" title="Caramelized Catfish Sand Pot" />
54
+ <link rel="next bookmark" href="http://www.publicradio.org/columns/splendid-table/recipes/lynnes_green_bean_casserole_with_fresh_mushrooms_and_a_bonus.html" title="Lynne's Green Bean Casserole with Fresh Mushrooms and a Bonus" />
55
+
56
+ <title>My Mother's Brisket | Recipes | The Splendid Table | from American Public Media</title>
57
+ </head>
58
+ <body>
59
+
60
+ <a class="skiplink" href="#startcontent">Skip to content</a>
61
+ <!-- googleoff:all -->
62
+
63
+
64
+
65
+
66
+ <!-- START JS CONFIGURATION / FUNCTIONS FOR OAS -->
67
+ <script type="text/javascript">
68
+ <!--//
69
+ //configuration
70
+ OAS_url = 'http://oascentral.publicradio.org/RealMedia/ads/';
71
+ OAS_sitepage = 'splendidtable.publicradio.org';
72
+ OAS_listpos = 'Position1,Position2';
73
+ OAS_query = '';
74
+ OAS_target = '_top';
75
+ //end of configuration
76
+
77
+
78
+
79
+
80
+ OAS_version = 10;
81
+ OAS_rn = '001234567890'; OAS_rns = '1234567890';
82
+ OAS_rn = new String (Math.random()); OAS_rns = OAS_rn.substring (2, 11);
83
+
84
+
85
+
86
+
87
+ function OAS_NORMAL(pos) {
88
+ document.write('<a href=\"' + OAS_url + 'click_nx.ads/' + OAS_sitepage + '/1' + OAS_rns + '@' + OAS_listpos + '!' + pos + '?' + OAS_query + '\" target=\"' + OAS_target + '\">');
89
+ document.write('<img src=\"' + OAS_url + 'adstream_nx.ads/' + OAS_sitepage + '/1' + OAS_rns + '@' + OAS_listpos + '!' + pos + '?' + OAS_query + '\" border=\"0\" /></a>');
90
+ }
91
+
92
+
93
+
94
+
95
+ OAS_version = 11;
96
+ if ((navigator.userAgent.indexOf('Mozilla/3') != -1) || (navigator.userAgent.indexOf('Mozilla/4.0 WebTV') != -1))
97
+ OAS_version = 10;
98
+ if (OAS_version >= 11)
99
+ document.write('<SCR' + 'IPT LANGUAGE=\"JavaScript1.1\" SRC=\"' + OAS_url + 'adstream_mjx.ads/' + OAS_sitepage + '/1' + OAS_rns + '@' + OAS_listpos + '?' + OAS_query + '\"><\/SCRIPT>');
100
+ document.write('');
101
+
102
+ function OAS_AD(pos) {
103
+ if (OAS_version >= 11)
104
+ OAS_RICH(pos);
105
+ else
106
+ OAS_NORMAL(pos);
107
+ }
108
+ //-->
109
+ </script>
110
+ <!-- END JS CONFIGURATION / FUNCTIONS FOR OAS -->
111
+
112
+
113
+
114
+
115
+ <!-- googleon:all --><div id="apmHeaderBar" class="apm_spt apmFdOff">
116
+ <div id="apmGlobalHead">
117
+ <a href="http://www.americanpublicmedia.org" ><img alt="American Public Media" src="http://www.publicradio.org/config/cobrand/standard/images/apm002/apm_logo_v.png" id="apmWebLogo" class="pngImg" /></a>
118
+
119
+ <div id="apmDropDown">
120
+ <div id="apmMenuLabel">
121
+ <img alt="American Public Media Programs" src="http://www.publicradio.org/config/cobrand/standard/images/apm002/apmProgramsOff.gif" id="apmLabelButton" />
122
+ </div>
123
+ <ul id="apmMenu" class="apmMenu">
124
+ <li class="apmPrgCategory">NEWS &amp; ENTERTAINMENT PROGRAMS</li>
125
+
126
+
127
+
128
+
129
+ <li class="apmProg">
130
+ <a href="http://americanradioworks.publicradio.org/?refid=3">
131
+ <span class="apmPgName">American RadioWorks</span>
132
+ <span class="apmPgDesc">Award winning documentaries</span>
133
+ </a>
134
+ </li>
135
+ <li class="apmProg">
136
+ <a href="http://americanroutes.publicradio.org/">
137
+
138
+
139
+
140
+
141
+ <span class="apmPgName">American Routes</span>
142
+ <span class="apmPgDesc">Exploring American musical genres</span>
143
+ </a>
144
+ </li>
145
+ <li class="apmProg">
146
+ <a href="http://www.cbc.ca/asithappens/">
147
+ <span class="apmPgName">As It Happens</span>
148
+
149
+
150
+
151
+
152
+ <span class="apmPgDesc">The stories behind current affairs</span>
153
+ </a>
154
+ </li>
155
+ <li class="apmProg">
156
+ <a href="http://speakingoffaith.publicradio.org/?refid=3">
157
+ <span class="apmPgName">Being</span>
158
+ <span class="apmPgDesc">Conversations on religion and life</span>
159
+
160
+
161
+
162
+
163
+ </a>
164
+ </li>
165
+ <li class="apmProg">
166
+ <a href="http://www.dinnerpartydownload.org/?refid=3">
167
+ <span class="apmPgName">Dinner Party Download</span>
168
+ <span class="apmPgDesc">Win your next dinner party</span>
169
+ </a>
170
+ </li>
171
+
172
+
173
+
174
+
175
+ <li class="apmProg">
176
+ <a href="http://marketplace.publicradio.org/?refid=3">
177
+ <span class="apmPgName">Marketplace</span>
178
+ <span class="apmPgDesc">Business news for the rest of us</span>
179
+ </a>
180
+ </li>
181
+ <li class="apmProg">
182
+ <a href="http://marketplacemoney.publicradio.org/?refid=3">
183
+
184
+
185
+
186
+
187
+ <span class="apmPgName">Marketplace Money</span>
188
+ <span class="apmPgDesc">How money makes the world go 'round</span>
189
+ </a>
190
+ </li>
191
+ <li class="apmProg">
192
+ <a href="http://marketplacemoney.publicradio.org/?refid=3">
193
+ <span class="apmPgName">Marketplace Morning Report</span>
194
+
195
+
196
+
197
+
198
+ <span class="apmPgDesc">8 minutes you can't afford to miss</span>
199
+ </a>
200
+ </li>
201
+ <li class="apmProg">
202
+ <a href="http://marketplace.publicradio.org/show/tech-report/?refid=3">
203
+ <span class="apmPgName">Marketplace Tech Report</span>
204
+ <span class="apmPgDesc">A guide to the modern world</span>
205
+
206
+
207
+
208
+
209
+ </a>
210
+ </li>
211
+ <li class="apmProg">
212
+ <a href="http://prairiehome.publicradio.org/?refid=3">
213
+ <span class="apmPgName">A Prairie Home Companion</span>
214
+ <span class="apmPgDesc">Variety show with Garrison Keillor</span>
215
+ </a>
216
+ </li>
217
+
218
+
219
+
220
+
221
+ <li class="apmProg">
222
+ <a href="http://splendidtable.publicradio.org/?refid=3">
223
+ <span class="apmPgName">The Splendid Table</span>
224
+ <span class="apmPgDesc">Public radio's show about food</span>
225
+ </a>
226
+ </li>
227
+ <li class="apmProg">
228
+ <a href="http://www.thestory.org/?refid=3">
229
+
230
+
231
+
232
+
233
+ <span class="apmPgName">The Story</span>
234
+ <span class="apmPgDesc">The human side of news and issues</span>
235
+ </a>
236
+ </li>
237
+ <li class="apmProg">
238
+ <a href="http://writersalmanac.publicradio.org/?refid=3">
239
+ <span class="apmPgName">The Writer's Almanac</span>
240
+
241
+
242
+
243
+
244
+ <span class="apmPgDesc">Today in history and a poem or two</span>
245
+ </a>
246
+ </li>
247
+ <li class="apmPrgCategory">CLASSICAL MUSIC</li>
248
+ <li class="apmProg">
249
+ <a href="http://americanpublicmedia.publicradio.org/programs/classical_live/">
250
+ <span class="apmPgName">Classical Live</span>
251
+
252
+
253
+
254
+
255
+ <span class="apmPgDesc">The best concert events of the year</span>
256
+ </a>
257
+ </li>
258
+ <li class="apmProg">
259
+ <a href="http://composersdatebook.publicradio.org/?refid=3">
260
+ <span class="apmPgName">Composers Datebook</span>
261
+ <span class="apmPgDesc">Profiles of composers in history</span>
262
+
263
+
264
+
265
+
266
+ </a>
267
+ </li>
268
+ <li class="apmProg">
269
+ <a href="http://americanpublicmedia.publicradio.org/programs/holidays/?refid=3">
270
+ <span class="apmPgName">Holiday Specials</span>
271
+ <span class="apmPgDesc">Programs to celebrate the season</span>
272
+ </a>
273
+ </li>
274
+
275
+
276
+
277
+
278
+ <li class="apmProg">
279
+ <a href="http://performancetoday.publicradio.org/?refid=3">
280
+ <span class="apmPgName">Performance Today</span>
281
+ <span class="apmPgDesc">America's classical conversation</span>
282
+ </a>
283
+ </li>
284
+ <li class="apmProg">
285
+ <a href="http://pipedreams.publicradio.org/?refid=3">
286
+
287
+
288
+
289
+
290
+ <span class="apmPgName">Pipedreams</span>
291
+ <span class="apmPgDesc">Celebrating the King of instruments</span>
292
+ </a>
293
+ </li>
294
+ <li class="apmProg">
295
+ <a href="http://saintpaulsunday.publicradio.org/?refid=3">
296
+ <span class="apmPgName">Saint Paul Sunday</span>
297
+
298
+
299
+
300
+
301
+ <span class="apmPgDesc">In-studio music and conversation</span>
302
+ </a>
303
+ </li>
304
+ <li class="apmProg apmProgLast">
305
+ <a href="http://symphonycast.publicradio.org/?refid=3">
306
+ <span class="apmPgName">SymphonyCast</span>
307
+ <span class="apmPgDesc">The great orchestras in concert</span>
308
+
309
+
310
+
311
+
312
+ </a>
313
+ </li>
314
+ </ul>
315
+ </div> </div>
316
+ </div>
317
+
318
+
319
+
320
+
321
+ <div id="apmContainer">
322
+ <a id="startcontent"></a>
323
+ <!-- KEEP WIDE SITE IN ONE COLUMN -->
324
+
325
+
326
+
327
+
328
+
329
+
330
+
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+
340
+ <div id="outerWrapper">
341
+
342
+ <!-- BEGIN image HEADER -->
343
+ <div id="header">
344
+ <h5 class="text_replacement"><a href="http://www.splendidtable.org/">The Splendid Table
345
+ The show for people who love to eat.</a></h5>
346
+ <div id="searchWrapper">
347
+ <form name="search" id="searchbox" action="http://find.publicradio.org/search" method="get">
348
+
349
+
350
+
351
+
352
+
353
+
354
+
355
+
356
+ <input type="hidden" name="site" value="spt" />
357
+ <input type="hidden" name="client" value="spt" />
358
+
359
+
360
+
361
+
362
+ <input type="hidden" name="proxystylesheet" value="spt" />
363
+ <input type="hidden" name="filter" value="p" />
364
+ <input type="hidden" name="access" value="p" />
365
+ <input type="hidden" name="output" value="xml_no_dtd" />
366
+ <input id="programSearchBox" class="empty" type="text" name="q" value="recipes, ingredients, shows..."/><input type="submit" name="searchButton" value="Search" id="searchButton" />
367
+
368
+
369
+
370
+
371
+
372
+
373
+
374
+
375
+ </form>
376
+
377
+
378
+
379
+
380
+ </div>
381
+
382
+
383
+
384
+
385
+ </div><!-- END image HEADER -->
386
+
387
+
388
+
389
+
390
+ <div id="navContentWrapper">
391
+ <div id="nav">
392
+ <div id="innerNav">
393
+
394
+ <a href="http://www.splendidtable.org/recipes/" class="current">Recipes</a> &middot;
395
+ <a href="http://www.splendidtable.org/listings/">Episodes</a> &middot;
396
+ <a href="http://www.splendidtable.org/where-we-eat/">Where We Eat</a> &middot;
397
+ <a href="http://www.splendidtable.org/htew">Blog</a> &middot;
398
+ <a href="http://www.publicradio.org/columns/splendid-table/features/">Tips</a> &middot;
399
+ <a href="http://www.splendidtable.org/features/stump/">Stump!</a> &middot;
400
+ <a href="http://www.splendidtable.org/store/">Store</a> &middot;
401
+ <a href="http://www.splendidtable.org/contribute/">Contribute</a>
402
+
403
+
404
+ </div>
405
+ </div>
406
+
407
+
408
+ <div id="content">
409
+ <!-- end header include -->
410
+
411
+
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+
421
+
422
+
423
+
424
+
425
+
426
+
427
+
428
+
429
+
430
+
431
+
432
+
433
+
434
+
435
+
436
+
437
+ <div class="grid_8">
438
+
439
+
440
+ <div class="hrecipe">
441
+ <span class="item">
442
+ <h1 class="fn">My Mother's Brisket</h1>
443
+ </span>
444
+ <p class="author"></p>
445
+ <div class="grid_4 alpha">
446
+
447
+
448
+
449
+
450
+ <div class="summary"><span class="author">Recipe from <em><a href="http://splendidtable.publicradio.org/store/?1449406971">The Brisket Book: A Love Story with Recipes.</a></em> by Stephanie Pierson (Andrew McMeel Publishing, 2011). Recipe reprinted with permission.<br /><br /></span>
451
+
452
+ <p> Prep time: <span class="preptime">20 min <span class="value-title" title="PT20M"></span></span></p>
453
+ <p> Cook time: <span class="cooktime">4 hours total bake time, divided<span class="value-title" title="PT4H"></span></span></p>
454
+ <p>Total time: <span class="duration">4 hours 20 min <span class="value-title" title="PT1H"></span></span></p>
455
+ <p>Yield: <span class="yield">10-12 servings</span></p>
456
+
457
+
458
+ <span class="summary">
459
+ <p>Best prepared a day or two before and gently reheated when ready to serve.</p>
460
+
461
+ <p>A truly delectable brisket, this has the distinction of being the only recipe in this book where the lid on the baking pan is left ajar. If you prefer a richer sauce, substitute half beef broth and half wine for the water. Tip: It&#8217;s really important for the flavor and the color of the finished sauce to slowly cook the onions until deep golden.</p>
462
+
463
+ </span></div>
464
+ <div class="seperator"></div>
465
+
466
+
467
+
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+ <div id="recipeCategories">
476
+ Categories:
477
+ <ul class="categories">
478
+ <li><a href="http://www.publicradio.org/columns/splendid-table/recipes/comfort/" rel="tag">Comfort Food</a></li> <li><a href="http://www.publicradio.org/columns/splendid-table/recipes/main/" rel="tag">Main Dishes</a></li>
479
+ </ul>
480
+ </div>
481
+ <div class="seperator"></div>
482
+
483
+
484
+
485
+
486
+
487
+
488
+ <div id="recipePrintShare">
489
+ <a href="#" onclick="print_me(); return false;" class="print printRegularVersion">Print</a>
490
+ <a href="#" class="recipie sharing facebook"> </a>
491
+ <a href="#" class="recipie sharing delicious"> </a>
492
+ <a href="#" class="recipie sharing google"> </a>
493
+
494
+ <a href="#" class="recipie sharing twitter"> </a>
495
+ <a href="#" class="recipie sharing tumblr"> </a>
496
+ <a href="#" class="recipie sharing myspace"> </a>
497
+
498
+ <div class="seperator"></div>
499
+
500
+ </div>
501
+
502
+
503
+
504
+
505
+ <div>
506
+ <h5>Ingredients</h5>
507
+ <span class="ingredient">
508
+ <ul>
509
+
510
+ <li class="ingredient"><span class="amount">3 tablespoons</span> <span class="name">vegetable oil</span></li>
511
+ <li class="ingredient"><span class="amount">1 (5- to 6-pound)</span> first-cut <span class="name">beef brisket</span></li>
512
+ <li class="ingredient"><span class="amount">3/4 teaspoon</span> <span class="name">salt</span></li>
513
+ <li class="ingredient"><span class="amount">3/4 teaspoon</span> freshly ground <span class="name">black pepper</span></li>
514
+ <li class="ingredient"><span class="amount">3</span> large <span class="name">yellow onions</span>, cut into ½-inch pieces</li>
515
+ <li class="ingredient"><span class="amount">2 or 3</span> large cloves <span class="name">garlic</span>, or to taste, minced</li>
516
+ <li class="ingredient"><span class="amount">1 teaspoon</span> <span class="name">paprika</span>, preferably Hungarian</li>
517
+ </ul>
518
+ </span>
519
+ </div>
520
+
521
+
522
+
523
+ <!-- <div class="noPrint">
524
+ <div class="seperator full"></div>
525
+ <h3>Tips from Lynne</h3>
526
+ <ul>
527
+ <li><a href="#">Tips</a></li>
528
+ </ul>
529
+ </div>
530
+ -->
531
+
532
+
533
+ </div>
534
+
535
+ <div class="grid_4 omega">
536
+
537
+
538
+
539
+ <div class="noPrint">
540
+
541
+ <h5>Similar Recipes</h5>
542
+ <ul>
543
+
544
+
545
+
546
+
547
+ <li><a href="http://www.publicradio.org/columns/splendid-table/recipes/my_mothers_brisket.html">My Mother's Brisket</a></li>
548
+
549
+
550
+
551
+ <li><a href="http://www.publicradio.org/columns/splendid-table/recipes/sweet-sour_chicken_meatballs_with_candied_lemon_peel.html">Sweet-Sour Chicken Meatballs with Candied Lemon Peel</a></li>
552
+
553
+
554
+
555
+
556
+ </ul>
557
+ </div>
558
+ <div class="split seperate noPrint">
559
+ <div class="first">
560
+ <!-- <h3>Similar Recipes</h3>
561
+ <ul>
562
+ <li><a href="#"></a></li>
563
+
564
+ </ul> -->
565
+
566
+ <h3>Latest Recipes</h3>
567
+ <ul>
568
+
569
+ <li><a href="http://www.publicradio.org/columns/splendid-table/recipes/lynnes_green_bean_casserole_with_fresh_mushrooms_and_a_bonus.html">Lynne's Green Bean Casserole with Fresh Mushrooms and a Bonus</a></li>
570
+
571
+ <li><a href="http://www.publicradio.org/columns/splendid-table/recipes/my_mothers_brisket.html">My Mother's Brisket</a></li>
572
+
573
+ <li><a href="http://www.publicradio.org/columns/splendid-table/recipes/caramelized_catfish_sand_pot.html">Caramelized Catfish Sand Pot</a></li>
574
+
575
+ <li><a href="http://www.publicradio.org/columns/splendid-table/recipes/renaissance_lasagne_with_hand-rolled_pasta.html">Renaissance Lasagne with Hand-Rolled Pasta </a></li>
576
+
577
+ <li><a href="http://www.publicradio.org/columns/splendid-table/recipes/confit_of_gizzards.html">Confit of Gizzards</a></li>
578
+
579
+ &nbsp; </ul>
580
+
581
+ </div>
582
+ <div class="second">
583
+ <h3>Most Popular Recipes</h3>
584
+ <ul>
585
+
586
+ <li><a href="http://www.publicradio.org/columns/splendid-table/recipes/grilled_turkey_burgers.html">Grilled Turkey Burgers with Tomato-Mango Chutney</a></li>
587
+
588
+ <li><a href="http://www.publicradio.org/columns/splendid-table/recipes/shrimp_and_mango_summer_rolls.html">Shrimp and Mango Summer Rolls</a></li>
589
+
590
+ <li><a href="http://www.publicradio.org/columns/splendid-table/recipes/chickpea-couscous_salad_with_lemon_and_fresh_mint.html">Chickpea-Couscous Salad with Lemon and Fresh Mint</a></li>
591
+
592
+ <li><a href="http://www.publicradio.org/columns/splendid-table/recipes/tart_orange_panna_cotta_trifle.html">Tart Orange Panna Cotta Trifle</a></li>
593
+
594
+ <li><a href="http://www.publicradio.org/columns/splendid-table/recipes/green_beans_with_lemon_garlic_and_parmigiano_gremolata.html">Green Beans with Lemon, Garlic and Parmigiano Gremolata</a></li>
595
+
596
+ </ul>
597
+
598
+ </div>
599
+
600
+ <div class="clear_floats"></div>
601
+ </div>
602
+
603
+
604
+
605
+
606
+
607
+
608
+
609
+
610
+
611
+ <h5>Instructions</h5>
612
+ <span class="instructions">
613
+ <span class="instructions">
614
+ <ul>
615
+
616
+
617
+ <p>Preheat the oven to 375°F.
618
+
619
+ <p>In a Dutch oven or other heavy baking pan large enough to hold the brisket, heat 1 tablespoon of the oil in the oven for 10 minutes. Pat the brisket dry and season with salt and pepper to taste. Roast the brisket in the pan, uncovered, for 30 minutes.</p>
620
+
621
+ <p>While the brisket is roasting, in a large heavy skillet cook the onions in the remaining 2 tablespoons of oil over moderately high heat, stirring, until softened and beginning to turn golden. Reduce the heat and cook the onions, stirring occasionally and reducing the heat if necessary, until deep golden, about 20 minutes more. Stir in the garlic, paprika, salt, and pepper and cook for 1 minute. Stir in 3 cups of water and bring to a boil.</p>
622
+
623
+ <p>Spoon the onion mixture over the brisket and bake, covered, with lid ½ inch ajar, until the brisket is fork tender, about 3½ hours. (Check the pan every hour; if necessary, add more water.) Remove the brisket from the oven and cool in the onion mixture for 1 hour. </p>
624
+
625
+ <p>Remove the brisket from the pan, scraping the onion mixture back into the pan, and chill, wrapped in aluminum foil, overnight. Spoon the onion mixture into a 1-quart measuring cup and chill, covered, overnight.</p>
626
+
627
+ <p>Preheat the oven to 350°F.</p>
628
+
629
+ <p>Discard the fat from the onion mixture, add enough water to the mixture to measure 3 cups total, if necessary, and in a blender blend the gravy until smooth. Trim the fat, then slice the brisket against the grain (thick or thin). In a large ovenproof skillet heat the gravy until hot, add the brisket, cover with foil, and heat in the oven for about 30 minutes.</p>
630
+ </ul>
631
+ </span>
632
+
633
+ </span>
634
+
635
+
636
+
637
+ <div class="seperator full"></div>
638
+ </div><!--.hrecipe-->
639
+
640
+
641
+
642
+ </div>
643
+ <!--
644
+ <div class="entry-tags">
645
+ <h4>Tags<span class="delimiter">:</span></h4>
646
+ <ul>
647
+ <li><a href="javascript:void(0)" onclick="location.href='http://www.publicradio.org/cgi-bin/movabletype/mt-search.cgi?blog_id=165&amp;tag=brisket&amp;limit=20';return false;" rel="tag">brisket</a></li>
648
+ </ul>
649
+ </div>
650
+
651
+ -->
652
+
653
+ </div>
654
+
655
+ <div class="grid_4" id="rightSideBar">
656
+ <div class="ad first">
657
+ <div class="sponsor">Sponsor <a href="http://americanpublicmedia.publicradio.org/underwriting/" target="_blank" class="becomeSponsor">Become a sponsor</a></div>
658
+ <!-- START OAS AD 'Position1' -->
659
+
660
+ <script language="javascript" type="text/javascript">
661
+ <!--//
662
+ try{OAS_AD('Position1')}catch(err){};
663
+ //-->
664
+ </script>
665
+ <!-- END OAS AD 'Position1' -->
666
+ <div class="seperator full"></div>
667
+ </div>
668
+
669
+
670
+ <div>
671
+ <div class="split">
672
+ <div class="first">
673
+ <ul class="linkList compact">
674
+ <li><a href="http://splendidtable.org/stations/">Radio Stations</a></li>
675
+ <li><a href="http://splendidtable.org/newsletter/">Newsletters</a></li>
676
+ <li><a href="http://splendidtable.org/podcast/">Podcast</a></li>
677
+ </ul>
678
+ </div>
679
+ <div class="second">
680
+ <ul class="linkList compact">
681
+ <li><a href="http://splendidtable.org/rss/">RSS Feeds</a></li>
682
+ <li><a href="http://splendidtable.org/contact/">Contact Us</a></li>
683
+ <li><a href="http://www.facebook.com/pages/The-Splendid-Table/138577571136" title="The Splendid Table on Facebook" class="connect facebook"> </a> <a href="http://twitter.com/SplendidTable/" title="The Splendid Table on Twitter" class="connect twitter"> </a></li>
684
+ </ul>
685
+ </div>
686
+ <div class="clear_floats"></div>
687
+ </div>
688
+
689
+ <div class="seperator full"></div>
690
+ </div>
691
+ <div class="ad second">
692
+ <div class="sponsor">Sponsor <a href="http://americanpublicmedia.publicradio.org/underwriting/" target="_blank" class="becomeSponsor">Become a sponsor</a></div>
693
+ <!-- START OAS AD 'Position2' -->
694
+ <script language="javascript" type="text/javascript">
695
+ <!--//
696
+ try{OAS_AD('Position2')}catch(err){};
697
+ //-->
698
+ </script>
699
+ <!-- END OAS AD 'Position2' -->
700
+
701
+
702
+
703
+ </div>
704
+ <div class="seperator full"></div>
705
+ <!-- <a href="/holidays/"><img class="bottom" src="/holidays/images/SPTA-300x200-holidays.gif" alt="Holidays with Splendid Table" /></a>
706
+
707
+ <div class="seperator full"></div> -->
708
+
709
+
710
+
711
+ <a href="http://splendidtable.publicradio.org/store/"><img class="bottom" src="http://www.splendidtable.org/standard/images/st003/store-tile-home.gif" alt="The Splendid Table Store" /></a>
712
+ <div class="seperator full"></div>
713
+
714
+ </div>
715
+
716
+
717
+ <!-- end actual page content -->
718
+
719
+
720
+
721
+ <!-- START FOOTER -->
722
+ <div class="clear_floats"></div>
723
+
724
+
725
+
726
+ <!-- START FOOTER BAR -->
727
+ <div id="apmFooterBar" class="apm_spt">
728
+ <a href="http://www.americanpublicmedia.org" >
729
+ <img alt="American Public Media" src="http://www.publicradio.org/config/cobrand/standard/images/apm002/apm_logo_h.png" id="apmWebLogoH" class="pngImg" />
730
+ </a>
731
+ <span id="apmFooterBarText">&copy;
732
+ <script type="text/javascript">
733
+ var copyDate = new Date();
734
+ document.write(copyDate.getFullYear());
735
+ </script>
736
+ |&nbsp;&nbsp;
737
+ <a href="http://americanpublicmedia.publicradio.org/terms/">Terms and Conditions</a>
738
+ &nbsp;&nbsp;|&nbsp;&nbsp;
739
+ <a href="http://americanpublicmedia.publicradio.org/terms/">Privacy Policy</a></span>
740
+ </div>
741
+ <!-- END FOOTER BAR -->
742
+
743
+ <!-- START FOOTER CONTENT AND COLUMNS -->
744
+ <div id="apmFooterContent" class="apmFooterBGspt apmWideFooter">
745
+ <div id="apmFooterColumns">
746
+
747
+ <!-- START PROGRAM COLUMNS -->
748
+ <div id="apmProgList1">
749
+ <h5>Programs</h5>
750
+ <div class="apmPListA">
751
+ <a href="http://americanradioworks.publicradio.org/?refid=3">American RadioWorks</a>
752
+ </div>
753
+ <div class="apmPList">
754
+ <a href="http://americanroutes.publicradio.org/">American Routes</a>
755
+ </div>
756
+ <div class="apmPList">
757
+ <a href="http://composersdatebook.publicradio.org/?refid=3">Composers Datebook</a>
758
+ </div>
759
+ <div class="apmPList">
760
+ <a href="http://www.publicradio.org/columns/futuretense/?refid=3">Future Tense</a>
761
+ </div>
762
+ <div class="apmPList">
763
+ <a href="http://marketplace.publicradio.org/?refid=3">Marketplace</a>
764
+ </div>
765
+ <div class="apmPList">
766
+ <a href="http://marketplacemoney.publicradio.org/?refid=3">Marketplace Money</a>
767
+ </div>
768
+ </div>
769
+ <div id="apmProgList2">
770
+ <div class="apmPListA">
771
+ <a href="http://performancetoday.publicradio.org/?refid=3">Performance Today</a>
772
+ </div>
773
+ <div class="apmPList">
774
+ <a href="http://pipedreams.publicradio.org/?refid=3">Pipedreams</a>
775
+ </div>
776
+ <div class="apmPList">
777
+ <a href="http://prairiehome.publicradio.org/?refid=3">A Prairie Home Companion</a>
778
+ </div>
779
+ <div class="apmPList">
780
+ <a href="http://saintpaulsunday.publicradio.org/?refid=3">Saint Paul Sunday</a>
781
+ </div>
782
+ <div class="apmPList">
783
+ <a href="http://www.soundopinions.org/?refid=3">Sound Opinions</a>
784
+ </div>
785
+ </div>
786
+ <div id="apmProgList3">
787
+ <div class="apmPListA">
788
+ <a href="http://speakingoffaith.publicradio.org/?refid=3">Speaking of Faith</a>
789
+ </div>
790
+ <div class="apmPList">
791
+ <a href="http://splendidtable.publicradio.org/?refid=3">The Splendid Table</a>
792
+ </div>
793
+ <div class="apmPList">
794
+ <a href="http://www.thestory.org/?refid=3">The Story</a>
795
+ </div>
796
+ <div class="apmPList">
797
+ <a href="http://symphonycast.publicradio.org/?refid=3">SymphonyCast</a>
798
+ </div>
799
+ <div class="apmPList">
800
+ <a href="http://writersalmanac.publicradio.org/?refid=3">The Writer's Almanac</a>
801
+ </div>
802
+ <div class="apmPList">
803
+ <a href="http://americanpublicmedia.publicradio.org/programs/?refid=3">More&hellip;</a>
804
+ </div>
805
+ </div> <!-- END PROGRAM COLUMNS -->
806
+
807
+ <!-- START SUPPORT COLUMN -->
808
+ <div id="apmFooterSupport">
809
+ <h5>Support American Public Media</h5>
810
+ <p class="apmPromoText">American Public Media's online services are supported by users like you. <a href="https://contribute.publicradio.org/contribute.php?&refId=apm">Contribute now&hellip;</a></p>
811
+ </div> <!-- END SUPPORT COLUMN -->
812
+
813
+ <!-- START MORE COLUMN -->
814
+ <div id="apmFooterMore">
815
+ <h5>More from American Public Media</h5>
816
+ <div class="apmPListA">
817
+ <a href="http://americanpublicmedia.publicradio.org/podcasts/">APM Podcasts/RSS Feeds</a>
818
+ </div>
819
+ <div class="apmPList">
820
+ <a href="http://mail.publicradio.org/content/506927/forms/apm_signup.htm">APM Newsletters</a>
821
+ </div>
822
+ <div class="apmPList">
823
+ <a href="http://americanpublicmedia.publicradio.org/tools/itunes_u/">iTunes U</a>
824
+ </div>
825
+ <div class="apmPList">
826
+ <a href="http://www.publicradiotuner.com">Public Radio Tuner</a>
827
+ </div>
828
+ <div class="apmPList">
829
+ <a href="http://americanpublicmedia.publicradio.org/careers/">APM Careers</a>
830
+ </div>
831
+ <div class="apmPList">
832
+ <a href="http://americanpublicmedia.publicradio.org/">About APM</a>
833
+ </div>
834
+ <div class="apmPListB">
835
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
836
+ </div>
837
+ </div> <!-- END MORE COLUMN -->
838
+
839
+ <div class="apmFooterEnd">&nbsp;</div>
840
+ <!-- END FOOTER COLUMNS -->
841
+ </div>
842
+ <!-- END FOOTER CONTENT -->
843
+ </div>
844
+
845
+ <!-- JUMP TO PAGE END OR START RIGHT COLUMN -->
846
+ <!-- END RIGHT COLUMN -->
847
+ <!-- START NIELSEN TRACKING -->
848
+ <!-- googleoff:all -->
849
+
850
+ <!-- START Nielsen//NetRatings SiteCensus V5.3 -->
851
+ <!-- COPYRIGHT 2007 Nielsen//NetRatings -->
852
+ <script type="text/javascript">
853
+ var _rsCI= "us-mpr";
854
+ var _rsCG= "splendidtable";
855
+ var _rsDN= "//secure-us.imrworldwide.com/";
856
+ var _rsPLfl=0;
857
+ var _rsSE=1;
858
+ var _rsSM=1.0;
859
+ var _rsCL=1;
860
+ </script>
861
+ <script type="text/javascript" src="//secure-us.imrworldwide.com/v53.js"></script>
862
+ <noscript>
863
+ <div>
864
+ <img src="//secure-us.imrworldwide.com/cgi-bin/m?ci=us-mpr&amp;cg=splendidtable&amp;cc=1" alt=""/>
865
+ </div>
866
+ </noscript>
867
+ <!-- END Nielsen//NetRatings SiteCensus V5.3 -->
868
+ <!-- googleon:all --><!-- END NIELSEN TRACKING -->
869
+ <!-- START GOOGLE ANALYTICS -->
870
+ <!-- googleoff:all -->
871
+
872
+ <script type="text/javascript">
873
+ var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
874
+ document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
875
+ </script>
876
+ <script type="text/javascript">
877
+ try{
878
+ var pageTracker = _gat._getTracker("UA-9332806-1");
879
+ pageTracker._trackPageview();
880
+ } catch(err) {}
881
+ </script>
882
+ <!-- googleon:all --><!-- END GOOGLE ANALYTICS -->
883
+
884
+ <!-- START WEBTRENDS -->
885
+
886
+
887
+ <!-- START OF SmartSource Data Collector TAG -->
888
+ <!-- Copyright (c) 1996-2011 Webtrends Inc. All rights reserved. -->
889
+ <!-- Version: 9.4.0 -->
890
+ <!-- Tag Builder Version: 3.2 -->
891
+ <!-- Created: 5/16/2011 6:18:53 PM -->
892
+ <script src="http://splendidtable.publicradio.org/standard/js/webtrends.js" type="text/javascript"></script>
893
+ <!-- ----------------------------------------------------------------------------------- -->
894
+ <!-- Warning: The two script blocks below must remain inline. Moving them to an external -->
895
+ <!-- JavaScript include file can cause serious problems with cross-domain tracking. -->
896
+ <!-- ----------------------------------------------------------------------------------- -->
897
+ <script type="text/javascript">
898
+ //<![CDATA[
899
+ var _tag=new WebTrends();
900
+ _tag.dcsGetId();
901
+ //]]>
902
+ </script>
903
+ <script type="text/javascript">
904
+ //<![CDATA[
905
+ _tag.dcsCustom=function(){
906
+ // Add custom parameters here.
907
+ //_tag.DCSext.param_name=param_value;
908
+ }
909
+ _tag.dcsCollect();
910
+ //]]>
911
+ </script>
912
+ <noscript>
913
+ <div><img alt="DCSIMG" id="DCSIMG" width="1" height="1" src="//statse.webtrendslive.com/dcsilsvxjuz5bdnkqm1idhhol_3p5e/njs.gif?dcsuri=/nojavascript&amp;WT.js=No&amp;WT.tv=9.4.0&amp;dcssip=www.splendidtable.publicradio.org"/></div>
914
+ </noscript>
915
+ <!-- END OF SmartSource Data Collector TAG --><!-- END WEBTRENDS -->
916
+
917
+
918
+ <!-- END APM CONTAINER: RETURN TO PROGRAM FOR BODY/HTML CLOSING TAGS mt -->
919
+ </div>
920
+ </div>
921
+ </div>
922
+ </div><!-- outer wrapper end -->
923
+ <!-- END FOOTER -->
924
+
925
+ </body>
926
+ </html>