comparison tests/test-highlight.t @ 25867:a74e9806d17d stable

highlight: produce correct markup when there's a blank line just before EOF Due to how the colorized output from pygments was stripped of <pre> elements, when there was an empty line at the end of a file, highlight extension produced an incorrect markup (no closing tags from the fileline/annotateline template). It wasn't usually noticeable, because browsers were smart enough to see where the missing tags should've been, but in monoblue style it resulted in the last line having twice the normal height. Instead of awkwardly trying to strip outer <pre></pre> tags, let's make the formatter with nowrap=True, which should do what we need in pygments since at least 0.5 (2006-10-30). Example from monoblue style: Before: <div class="source"> <div style="font-family:monospace" class="parity0"> <pre><a class="linenr" href="#l1" id="l1"> 1</a> </pre> </div> <div style="font-family:monospace" class="parity1"> <pre><a class="linenr" href="#l2" id="l2"> 2</a> </div> Now: <div class="source"> <div style="font-family:monospace" class="parity0"> <pre><a class="linenr" href="#l1" id="l1"> 1</a> </pre> </div> <div style="font-family:monospace" class="parity1"> <pre><a class="linenr" href="#l2" id="l2"> 2</a> </pre> </div> </div> (Notice the missing </pre></div> now in place)
author Anton Shestakov <av6@dwimlabs.net>
date Wed, 22 Jul 2015 10:19:17 +0800
parents 63be46407a50
children d53212d70893
comparison
equal deleted inserted replaced
25866:8c1d7a0e737b 25867:a74e9806d17d
43 > except (ValueError, IndexError): 43 > except (ValueError, IndexError):
44 > n = 10 44 > n = 10
45 > p = primes() 45 > p = primes()
46 > print "The first %d primes: %s" % (n, list(islice(p, n))) 46 > print "The first %d primes: %s" % (n, list(islice(p, n)))
47 > EOF 47 > EOF
48 $ echo >> primes.py # to test html markup with an empty line just before EOF
48 $ hg ci -Ama 49 $ hg ci -Ama
49 adding primes.py 50 adding primes.py
50 51
51 hg serve 52 hg serve
52 53
66 <meta name="robots" content="index, nofollow" /> 67 <meta name="robots" content="index, nofollow" />
67 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" /> 68 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
68 <script type="text/javascript" src="/static/mercurial.js"></script> 69 <script type="text/javascript" src="/static/mercurial.js"></script>
69 70
70 <link rel="stylesheet" href="/highlightcss" type="text/css" /> 71 <link rel="stylesheet" href="/highlightcss" type="text/css" />
71 <title>test: 853dcd4de2a6 primes.py</title> 72 <title>test: 06824edf55d0 primes.py</title>
72 </head> 73 </head>
73 <body> 74 <body>
74 75
75 <div class="container"> 76 <div class="container">
76 <div class="menu"> 77 <div class="menu">
104 </div> 105 </div>
105 106
106 <div class="main"> 107 <div class="main">
107 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2> 108 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
108 <h3> 109 <h3>
109 view primes.py @ 0:<a href="/rev/853dcd4de2a6">853dcd4de2a6</a> 110 view primes.py @ 0:<a href="/rev/06824edf55d0">06824edf55d0</a>
110 <span class="tag">tip</span> 111 <span class="tag">tip</span>
111 </h3> 112 </h3>
112 113
113 <form class="search" action="/log"> 114 <form class="search" action="/log">
114 115
171 <span id="l27"> <span class="kn">try</span><span class="p">:</span></span><a href="#l27"></a> 172 <span id="l27"> <span class="kn">try</span><span class="p">:</span></span><a href="#l27"></a>
172 <span id="l28"> <span class="n">n</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span></span><a href="#l28"></a> 173 <span id="l28"> <span class="n">n</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span></span><a href="#l28"></a>
173 <span id="l29"> <span class="kn">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">IndexError</span><span class="p">):</span></span><a href="#l29"></a> 174 <span id="l29"> <span class="kn">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">IndexError</span><span class="p">):</span></span><a href="#l29"></a>
174 <span id="l30"> <span class="n">n</span> <span class="o">=</span> <span class="mi">10</span></span><a href="#l30"></a> 175 <span id="l30"> <span class="n">n</span> <span class="o">=</span> <span class="mi">10</span></span><a href="#l30"></a>
175 <span id="l31"> <span class="n">p</span> <span class="o">=</span> <span class="n">primes</span><span class="p">()</span></span><a href="#l31"></a> 176 <span id="l31"> <span class="n">p</span> <span class="o">=</span> <span class="n">primes</span><span class="p">()</span></span><a href="#l31"></a>
176 <span id="l32"> <span class="kn">print</span> <span class="s">&quot;The first </span><span class="si">%d</span><span class="s"> primes: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">islice</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">n</span><span class="p">)))</span></span><a href="#l32"></a></pre> 177 <span id="l32"> <span class="kn">print</span> <span class="s">&quot;The first </span><span class="si">%d</span><span class="s"> primes: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">islice</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">n</span><span class="p">)))</span></span><a href="#l32"></a>
178 <span id="l33"></span><a href="#l33"></a></pre>
177 <div class="sourcelast"></div> 179 <div class="sourcelast"></div>
178 </div> 180 </div>
179 </div> 181 </div>
180 </div> 182 </div>
181 183
238 </div> 240 </div>
239 241
240 <div class="main"> 242 <div class="main">
241 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2> 243 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
242 <h3> 244 <h3>
243 annotate primes.py @ 0:<a href="/rev/853dcd4de2a6">853dcd4de2a6</a> 245 annotate primes.py @ 0:<a href="/rev/06824edf55d0">06824edf55d0</a>
244 <span class="tag">tip</span> 246 <span class="tag">tip</span>
245 </h3> 247 </h3>
246 248
247 <form class="search" action="/log"> 249 <form class="search" action="/log">
248 250
282 </thead> 284 </thead>
283 <tbody class="stripes2"> 285 <tbody class="stripes2">
284 286
285 <tr id="l1"> 287 <tr id="l1">
286 <td class="annotate"> 288 <td class="annotate">
287 <a href="/annotate/853dcd4de2a6/primes.py#l1" 289 <a href="/annotate/06824edf55d0/primes.py#l1"
288 title="853dcd4de2a6: a">test@0</a> 290 title="06824edf55d0: a">test@0</a>
289 </td> 291 </td>
290 <td class="source"><a href="#l1"> 1</a> <span class="c">#!/usr/bin/env python</span></td> 292 <td class="source"><a href="#l1"> 1</a> <span class="c">#!/usr/bin/env python</span></td>
291 </tr> 293 </tr>
292 <tr id="l2"> 294 <tr id="l2">
293 <td class="annotate"> 295 <td class="annotate">
294 <a href="/annotate/853dcd4de2a6/primes.py#l2" 296 <a href="/annotate/06824edf55d0/primes.py#l2"
295 title="853dcd4de2a6: a">test@0</a> 297 title="06824edf55d0: a">test@0</a>
296 </td> 298 </td>
297 <td class="source"><a href="#l2"> 2</a> </td> 299 <td class="source"><a href="#l2"> 2</a> </td>
298 </tr> 300 </tr>
299 <tr id="l3"> 301 <tr id="l3">
300 <td class="annotate"> 302 <td class="annotate">
301 <a href="/annotate/853dcd4de2a6/primes.py#l3" 303 <a href="/annotate/06824edf55d0/primes.py#l3"
302 title="853dcd4de2a6: a">test@0</a> 304 title="06824edf55d0: a">test@0</a>
303 </td> 305 </td>
304 <td class="source"><a href="#l3"> 3</a> <span class="sd">&quot;&quot;&quot;Fun with generators. Corresponding Haskell implementation:</span></td> 306 <td class="source"><a href="#l3"> 3</a> <span class="sd">&quot;&quot;&quot;Fun with generators. Corresponding Haskell implementation:</span></td>
305 </tr> 307 </tr>
306 <tr id="l4"> 308 <tr id="l4">
307 <td class="annotate"> 309 <td class="annotate">
308 <a href="/annotate/853dcd4de2a6/primes.py#l4" 310 <a href="/annotate/06824edf55d0/primes.py#l4"
309 title="853dcd4de2a6: a">test@0</a> 311 title="06824edf55d0: a">test@0</a>
310 </td> 312 </td>
311 <td class="source"><a href="#l4"> 4</a> </td> 313 <td class="source"><a href="#l4"> 4</a> </td>
312 </tr> 314 </tr>
313 <tr id="l5"> 315 <tr id="l5">
314 <td class="annotate"> 316 <td class="annotate">
315 <a href="/annotate/853dcd4de2a6/primes.py#l5" 317 <a href="/annotate/06824edf55d0/primes.py#l5"
316 title="853dcd4de2a6: a">test@0</a> 318 title="06824edf55d0: a">test@0</a>
317 </td> 319 </td>
318 <td class="source"><a href="#l5"> 5</a> <span class="sd">primes = 2 : sieve [3, 5..]</span></td> 320 <td class="source"><a href="#l5"> 5</a> <span class="sd">primes = 2 : sieve [3, 5..]</span></td>
319 </tr> 321 </tr>
320 <tr id="l6"> 322 <tr id="l6">
321 <td class="annotate"> 323 <td class="annotate">
322 <a href="/annotate/853dcd4de2a6/primes.py#l6" 324 <a href="/annotate/06824edf55d0/primes.py#l6"
323 title="853dcd4de2a6: a">test@0</a> 325 title="06824edf55d0: a">test@0</a>
324 </td> 326 </td>
325 <td class="source"><a href="#l6"> 6</a> <span class="sd"> where sieve (p:ns) = p : sieve [n | n &lt;- ns, mod n p /= 0]</span></td> 327 <td class="source"><a href="#l6"> 6</a> <span class="sd"> where sieve (p:ns) = p : sieve [n | n &lt;- ns, mod n p /= 0]</span></td>
326 </tr> 328 </tr>
327 <tr id="l7"> 329 <tr id="l7">
328 <td class="annotate"> 330 <td class="annotate">
329 <a href="/annotate/853dcd4de2a6/primes.py#l7" 331 <a href="/annotate/06824edf55d0/primes.py#l7"
330 title="853dcd4de2a6: a">test@0</a> 332 title="06824edf55d0: a">test@0</a>
331 </td> 333 </td>
332 <td class="source"><a href="#l7"> 7</a> <span class="sd">&quot;&quot;&quot;</span></td> 334 <td class="source"><a href="#l7"> 7</a> <span class="sd">&quot;&quot;&quot;</span></td>
333 </tr> 335 </tr>
334 <tr id="l8"> 336 <tr id="l8">
335 <td class="annotate"> 337 <td class="annotate">
336 <a href="/annotate/853dcd4de2a6/primes.py#l8" 338 <a href="/annotate/06824edf55d0/primes.py#l8"
337 title="853dcd4de2a6: a">test@0</a> 339 title="06824edf55d0: a">test@0</a>
338 </td> 340 </td>
339 <td class="source"><a href="#l8"> 8</a> </td> 341 <td class="source"><a href="#l8"> 8</a> </td>
340 </tr> 342 </tr>
341 <tr id="l9"> 343 <tr id="l9">
342 <td class="annotate"> 344 <td class="annotate">
343 <a href="/annotate/853dcd4de2a6/primes.py#l9" 345 <a href="/annotate/06824edf55d0/primes.py#l9"
344 title="853dcd4de2a6: a">test@0</a> 346 title="06824edf55d0: a">test@0</a>
345 </td> 347 </td>
346 <td class="source"><a href="#l9"> 9</a> <span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">dropwhile</span><span class="p">,</span> <span class="n">ifilter</span><span class="p">,</span> <span class="n">islice</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">chain</span></td> 348 <td class="source"><a href="#l9"> 9</a> <span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">dropwhile</span><span class="p">,</span> <span class="n">ifilter</span><span class="p">,</span> <span class="n">islice</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">chain</span></td>
347 </tr> 349 </tr>
348 <tr id="l10"> 350 <tr id="l10">
349 <td class="annotate"> 351 <td class="annotate">
350 <a href="/annotate/853dcd4de2a6/primes.py#l10" 352 <a href="/annotate/06824edf55d0/primes.py#l10"
351 title="853dcd4de2a6: a">test@0</a> 353 title="06824edf55d0: a">test@0</a>
352 </td> 354 </td>
353 <td class="source"><a href="#l10"> 10</a> </td> 355 <td class="source"><a href="#l10"> 10</a> </td>
354 </tr> 356 </tr>
355 <tr id="l11"> 357 <tr id="l11">
356 <td class="annotate"> 358 <td class="annotate">
357 <a href="/annotate/853dcd4de2a6/primes.py#l11" 359 <a href="/annotate/06824edf55d0/primes.py#l11"
358 title="853dcd4de2a6: a">test@0</a> 360 title="06824edf55d0: a">test@0</a>
359 </td> 361 </td>
360 <td class="source"><a href="#l11"> 11</a> <span class="kn">def</span> <span class="nf">primes</span><span class="p">():</span></td> 362 <td class="source"><a href="#l11"> 11</a> <span class="kn">def</span> <span class="nf">primes</span><span class="p">():</span></td>
361 </tr> 363 </tr>
362 <tr id="l12"> 364 <tr id="l12">
363 <td class="annotate"> 365 <td class="annotate">
364 <a href="/annotate/853dcd4de2a6/primes.py#l12" 366 <a href="/annotate/06824edf55d0/primes.py#l12"
365 title="853dcd4de2a6: a">test@0</a> 367 title="06824edf55d0: a">test@0</a>
366 </td> 368 </td>
367 <td class="source"><a href="#l12"> 12</a> <span class="sd">&quot;&quot;&quot;Generate all primes.&quot;&quot;&quot;</span></td> 369 <td class="source"><a href="#l12"> 12</a> <span class="sd">&quot;&quot;&quot;Generate all primes.&quot;&quot;&quot;</span></td>
368 </tr> 370 </tr>
369 <tr id="l13"> 371 <tr id="l13">
370 <td class="annotate"> 372 <td class="annotate">
371 <a href="/annotate/853dcd4de2a6/primes.py#l13" 373 <a href="/annotate/06824edf55d0/primes.py#l13"
372 title="853dcd4de2a6: a">test@0</a> 374 title="06824edf55d0: a">test@0</a>
373 </td> 375 </td>
374 <td class="source"><a href="#l13"> 13</a> <span class="kn">def</span> <span class="nf">sieve</span><span class="p">(</span><span class="n">ns</span><span class="p">):</span></td> 376 <td class="source"><a href="#l13"> 13</a> <span class="kn">def</span> <span class="nf">sieve</span><span class="p">(</span><span class="n">ns</span><span class="p">):</span></td>
375 </tr> 377 </tr>
376 <tr id="l14"> 378 <tr id="l14">
377 <td class="annotate"> 379 <td class="annotate">
378 <a href="/annotate/853dcd4de2a6/primes.py#l14" 380 <a href="/annotate/06824edf55d0/primes.py#l14"
379 title="853dcd4de2a6: a">test@0</a> 381 title="06824edf55d0: a">test@0</a>
380 </td> 382 </td>
381 <td class="source"><a href="#l14"> 14</a> <span class="n">p</span> <span class="o">=</span> <span class="n">ns</span><span class="o">.</span><span class="n">next</span><span class="p">()</span></td> 383 <td class="source"><a href="#l14"> 14</a> <span class="n">p</span> <span class="o">=</span> <span class="n">ns</span><span class="o">.</span><span class="n">next</span><span class="p">()</span></td>
382 </tr> 384 </tr>
383 <tr id="l15"> 385 <tr id="l15">
384 <td class="annotate"> 386 <td class="annotate">
385 <a href="/annotate/853dcd4de2a6/primes.py#l15" 387 <a href="/annotate/06824edf55d0/primes.py#l15"
386 title="853dcd4de2a6: a">test@0</a> 388 title="06824edf55d0: a">test@0</a>
387 </td> 389 </td>
388 <td class="source"><a href="#l15"> 15</a> <span class="c"># It is important to yield *here* in order to stop the</span></td> 390 <td class="source"><a href="#l15"> 15</a> <span class="c"># It is important to yield *here* in order to stop the</span></td>
389 </tr> 391 </tr>
390 <tr id="l16"> 392 <tr id="l16">
391 <td class="annotate"> 393 <td class="annotate">
392 <a href="/annotate/853dcd4de2a6/primes.py#l16" 394 <a href="/annotate/06824edf55d0/primes.py#l16"
393 title="853dcd4de2a6: a">test@0</a> 395 title="06824edf55d0: a">test@0</a>
394 </td> 396 </td>
395 <td class="source"><a href="#l16"> 16</a> <span class="c"># infinite recursion.</span></td> 397 <td class="source"><a href="#l16"> 16</a> <span class="c"># infinite recursion.</span></td>
396 </tr> 398 </tr>
397 <tr id="l17"> 399 <tr id="l17">
398 <td class="annotate"> 400 <td class="annotate">
399 <a href="/annotate/853dcd4de2a6/primes.py#l17" 401 <a href="/annotate/06824edf55d0/primes.py#l17"
400 title="853dcd4de2a6: a">test@0</a> 402 title="06824edf55d0: a">test@0</a>
401 </td> 403 </td>
402 <td class="source"><a href="#l17"> 17</a> <span class="kn">yield</span> <span class="n">p</span></td> 404 <td class="source"><a href="#l17"> 17</a> <span class="kn">yield</span> <span class="n">p</span></td>
403 </tr> 405 </tr>
404 <tr id="l18"> 406 <tr id="l18">
405 <td class="annotate"> 407 <td class="annotate">
406 <a href="/annotate/853dcd4de2a6/primes.py#l18" 408 <a href="/annotate/06824edf55d0/primes.py#l18"
407 title="853dcd4de2a6: a">test@0</a> 409 title="06824edf55d0: a">test@0</a>
408 </td> 410 </td>
409 <td class="source"><a href="#l18"> 18</a> <span class="n">ns</span> <span class="o">=</span> <span class="n">ifilter</span><span class="p">(</span><span class="kn">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="n">n</span> <span class="o">%</span> <span class="n">p</span> <span class="o">!=</span> <span class="mf">0</span><span class="p">,</span> <span class="n">ns</span><span class="p">)</span></td> 411 <td class="source"><a href="#l18"> 18</a> <span class="n">ns</span> <span class="o">=</span> <span class="n">ifilter</span><span class="p">(</span><span class="kn">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="n">n</span> <span class="o">%</span> <span class="n">p</span> <span class="o">!=</span> <span class="mf">0</span><span class="p">,</span> <span class="n">ns</span><span class="p">)</span></td>
410 </tr> 412 </tr>
411 <tr id="l19"> 413 <tr id="l19">
412 <td class="annotate"> 414 <td class="annotate">
413 <a href="/annotate/853dcd4de2a6/primes.py#l19" 415 <a href="/annotate/06824edf55d0/primes.py#l19"
414 title="853dcd4de2a6: a">test@0</a> 416 title="06824edf55d0: a">test@0</a>
415 </td> 417 </td>
416 <td class="source"><a href="#l19"> 19</a> <span class="kn">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">sieve</span><span class="p">(</span><span class="n">ns</span><span class="p">):</span></td> 418 <td class="source"><a href="#l19"> 19</a> <span class="kn">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">sieve</span><span class="p">(</span><span class="n">ns</span><span class="p">):</span></td>
417 </tr> 419 </tr>
418 <tr id="l20"> 420 <tr id="l20">
419 <td class="annotate"> 421 <td class="annotate">
420 <a href="/annotate/853dcd4de2a6/primes.py#l20" 422 <a href="/annotate/06824edf55d0/primes.py#l20"
421 title="853dcd4de2a6: a">test@0</a> 423 title="06824edf55d0: a">test@0</a>
422 </td> 424 </td>
423 <td class="source"><a href="#l20"> 20</a> <span class="kn">yield</span> <span class="n">n</span></td> 425 <td class="source"><a href="#l20"> 20</a> <span class="kn">yield</span> <span class="n">n</span></td>
424 </tr> 426 </tr>
425 <tr id="l21"> 427 <tr id="l21">
426 <td class="annotate"> 428 <td class="annotate">
427 <a href="/annotate/853dcd4de2a6/primes.py#l21" 429 <a href="/annotate/06824edf55d0/primes.py#l21"
428 title="853dcd4de2a6: a">test@0</a> 430 title="06824edf55d0: a">test@0</a>
429 </td> 431 </td>
430 <td class="source"><a href="#l21"> 21</a> </td> 432 <td class="source"><a href="#l21"> 21</a> </td>
431 </tr> 433 </tr>
432 <tr id="l22"> 434 <tr id="l22">
433 <td class="annotate"> 435 <td class="annotate">
434 <a href="/annotate/853dcd4de2a6/primes.py#l22" 436 <a href="/annotate/06824edf55d0/primes.py#l22"
435 title="853dcd4de2a6: a">test@0</a> 437 title="06824edf55d0: a">test@0</a>
436 </td> 438 </td>
437 <td class="source"><a href="#l22"> 22</a> <span class="n">odds</span> <span class="o">=</span> <span class="n">ifilter</span><span class="p">(</span><span class="kn">lambda</span> <span class="n">i</span><span class="p">:</span> <span class="n">i</span> <span class="o">%</span> <span class="mf">2</span> <span class="o">==</span> <span class="mf">1</span><span class="p">,</span> <span class="n">count</span><span class="p">())</span></td> 439 <td class="source"><a href="#l22"> 22</a> <span class="n">odds</span> <span class="o">=</span> <span class="n">ifilter</span><span class="p">(</span><span class="kn">lambda</span> <span class="n">i</span><span class="p">:</span> <span class="n">i</span> <span class="o">%</span> <span class="mf">2</span> <span class="o">==</span> <span class="mf">1</span><span class="p">,</span> <span class="n">count</span><span class="p">())</span></td>
438 </tr> 440 </tr>
439 <tr id="l23"> 441 <tr id="l23">
440 <td class="annotate"> 442 <td class="annotate">
441 <a href="/annotate/853dcd4de2a6/primes.py#l23" 443 <a href="/annotate/06824edf55d0/primes.py#l23"
442 title="853dcd4de2a6: a">test@0</a> 444 title="06824edf55d0: a">test@0</a>
443 </td> 445 </td>
444 <td class="source"><a href="#l23"> 23</a> <span class="kn">return</span> <span class="n">chain</span><span class="p">([</span><span class="mf">2</span><span class="p">],</span> <span class="n">sieve</span><span class="p">(</span><span class="n">dropwhile</span><span class="p">(</span><span class="kn">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mf">3</span><span class="p">,</span> <span class="n">odds</span><span class="p">)))</span></td> 446 <td class="source"><a href="#l23"> 23</a> <span class="kn">return</span> <span class="n">chain</span><span class="p">([</span><span class="mf">2</span><span class="p">],</span> <span class="n">sieve</span><span class="p">(</span><span class="n">dropwhile</span><span class="p">(</span><span class="kn">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mf">3</span><span class="p">,</span> <span class="n">odds</span><span class="p">)))</span></td>
445 </tr> 447 </tr>
446 <tr id="l24"> 448 <tr id="l24">
447 <td class="annotate"> 449 <td class="annotate">
448 <a href="/annotate/853dcd4de2a6/primes.py#l24" 450 <a href="/annotate/06824edf55d0/primes.py#l24"
449 title="853dcd4de2a6: a">test@0</a> 451 title="06824edf55d0: a">test@0</a>
450 </td> 452 </td>
451 <td class="source"><a href="#l24"> 24</a> </td> 453 <td class="source"><a href="#l24"> 24</a> </td>
452 </tr> 454 </tr>
453 <tr id="l25"> 455 <tr id="l25">
454 <td class="annotate"> 456 <td class="annotate">
455 <a href="/annotate/853dcd4de2a6/primes.py#l25" 457 <a href="/annotate/06824edf55d0/primes.py#l25"
456 title="853dcd4de2a6: a">test@0</a> 458 title="06824edf55d0: a">test@0</a>
457 </td> 459 </td>
458 <td class="source"><a href="#l25"> 25</a> <span class="kn">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span></td> 460 <td class="source"><a href="#l25"> 25</a> <span class="kn">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span></td>
459 </tr> 461 </tr>
460 <tr id="l26"> 462 <tr id="l26">
461 <td class="annotate"> 463 <td class="annotate">
462 <a href="/annotate/853dcd4de2a6/primes.py#l26" 464 <a href="/annotate/06824edf55d0/primes.py#l26"
463 title="853dcd4de2a6: a">test@0</a> 465 title="06824edf55d0: a">test@0</a>
464 </td> 466 </td>
465 <td class="source"><a href="#l26"> 26</a> <span class="kn">import</span> <span class="nn">sys</span></td> 467 <td class="source"><a href="#l26"> 26</a> <span class="kn">import</span> <span class="nn">sys</span></td>
466 </tr> 468 </tr>
467 <tr id="l27"> 469 <tr id="l27">
468 <td class="annotate"> 470 <td class="annotate">
469 <a href="/annotate/853dcd4de2a6/primes.py#l27" 471 <a href="/annotate/06824edf55d0/primes.py#l27"
470 title="853dcd4de2a6: a">test@0</a> 472 title="06824edf55d0: a">test@0</a>
471 </td> 473 </td>
472 <td class="source"><a href="#l27"> 27</a> <span class="kn">try</span><span class="p">:</span></td> 474 <td class="source"><a href="#l27"> 27</a> <span class="kn">try</span><span class="p">:</span></td>
473 </tr> 475 </tr>
474 <tr id="l28"> 476 <tr id="l28">
475 <td class="annotate"> 477 <td class="annotate">
476 <a href="/annotate/853dcd4de2a6/primes.py#l28" 478 <a href="/annotate/06824edf55d0/primes.py#l28"
477 title="853dcd4de2a6: a">test@0</a> 479 title="06824edf55d0: a">test@0</a>
478 </td> 480 </td>
479 <td class="source"><a href="#l28"> 28</a> <span class="n">n</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mf">1</span><span class="p">])</span></td> 481 <td class="source"><a href="#l28"> 28</a> <span class="n">n</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mf">1</span><span class="p">])</span></td>
480 </tr> 482 </tr>
481 <tr id="l29"> 483 <tr id="l29">
482 <td class="annotate"> 484 <td class="annotate">
483 <a href="/annotate/853dcd4de2a6/primes.py#l29" 485 <a href="/annotate/06824edf55d0/primes.py#l29"
484 title="853dcd4de2a6: a">test@0</a> 486 title="06824edf55d0: a">test@0</a>
485 </td> 487 </td>
486 <td class="source"><a href="#l29"> 29</a> <span class="kn">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">IndexError</span><span class="p">):</span></td> 488 <td class="source"><a href="#l29"> 29</a> <span class="kn">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">IndexError</span><span class="p">):</span></td>
487 </tr> 489 </tr>
488 <tr id="l30"> 490 <tr id="l30">
489 <td class="annotate"> 491 <td class="annotate">
490 <a href="/annotate/853dcd4de2a6/primes.py#l30" 492 <a href="/annotate/06824edf55d0/primes.py#l30"
491 title="853dcd4de2a6: a">test@0</a> 493 title="06824edf55d0: a">test@0</a>
492 </td> 494 </td>
493 <td class="source"><a href="#l30"> 30</a> <span class="n">n</span> <span class="o">=</span> <span class="mf">10</span></td> 495 <td class="source"><a href="#l30"> 30</a> <span class="n">n</span> <span class="o">=</span> <span class="mf">10</span></td>
494 </tr> 496 </tr>
495 <tr id="l31"> 497 <tr id="l31">
496 <td class="annotate"> 498 <td class="annotate">
497 <a href="/annotate/853dcd4de2a6/primes.py#l31" 499 <a href="/annotate/06824edf55d0/primes.py#l31"
498 title="853dcd4de2a6: a">test@0</a> 500 title="06824edf55d0: a">test@0</a>
499 </td> 501 </td>
500 <td class="source"><a href="#l31"> 31</a> <span class="n">p</span> <span class="o">=</span> <span class="n">primes</span><span class="p">()</span></td> 502 <td class="source"><a href="#l31"> 31</a> <span class="n">p</span> <span class="o">=</span> <span class="n">primes</span><span class="p">()</span></td>
501 </tr> 503 </tr>
502 <tr id="l32"> 504 <tr id="l32">
503 <td class="annotate"> 505 <td class="annotate">
504 <a href="/annotate/853dcd4de2a6/primes.py#l32" 506 <a href="/annotate/06824edf55d0/primes.py#l32"
505 title="853dcd4de2a6: a">test@0</a> 507 title="06824edf55d0: a">test@0</a>
506 </td> 508 </td>
507 <td class="source"><a href="#l32"> 32</a> <span class="kn">print</span> <span class="s">&quot;The first </span><span class="si">%d</span><span class="s"> primes: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">islice</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">n</span><span class="p">)))</span></td> 509 <td class="source"><a href="#l32"> 32</a> <span class="kn">print</span> <span class="s">&quot;The first </span><span class="si">%d</span><span class="s"> primes: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">islice</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">n</span><span class="p">)))</span></td>
510 </tr>
511 <tr id="l33">
512 <td class="annotate">
513 <a href="/annotate/06824edf55d0/primes.py#l33"
514 title="06824edf55d0: a">test@0</a>
515 </td>
516 <td class="source"><a href="#l33"> 33</a> </td>
508 </tr> 517 </tr>
509 </tbody> 518 </tbody>
510 </table> 519 </table>
511 </div> 520 </div>
512 </div> 521 </div>