wikitext 1.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -87,7 +87,7 @@ describe Wikitext::Parser, 'with large slab of input text' do
87
87
  notice how it can contain ''markup''
88
88
  which would '''otherwise''' have <tt>special</tt> meaning
89
89
  although explicit entities &copy; are passed through unchanged
90
-
90
+
91
91
  a normal paragraph again
92
92
 
93
93
  {{an_image.png}}
data/spec/pre_spec.rb CHANGED
@@ -29,6 +29,33 @@ describe Wikitext::Parser, 'parsing PRE blocks' do
29
29
  @parser.parse(" foo\n bar").should == "<pre>foo\nbar</pre>\n"
30
30
  end
31
31
 
32
+ it 'should handle "empty" lines in the middle of multiline PRE blocks' do
33
+ input = dedent <<-END
34
+ foo
35
+
36
+ bar
37
+ END
38
+ expected = dedent <<-END
39
+ <pre>foo
40
+
41
+ bar</pre>
42
+ END
43
+ @parser.parse(input).should == expected
44
+ end
45
+
46
+ it 'should render an empty block for an empty PRE block' do
47
+ @parser.parse(' ').should == "<pre></pre>\n"
48
+ end
49
+
50
+ it 'should sanely handle a leading empty line' do
51
+ @parser.parse(" \n foo").should == "<pre>\nfoo</pre>\n"
52
+ end
53
+
54
+ it 'should sanely handle a trailing empty line' do
55
+ @parser.parse(" foo\n \n").should == "<pre>foo\n</pre>\n"
56
+ @parser.parse(" foo\n ").should == "<pre>foo\n</pre>\n"
57
+ end
58
+
32
59
  it 'should allow nesting inside a <blockquote> block' do
33
60
  # nesting inside single blockquotes
34
61
  @parser.parse("> foo").should == "<blockquote>\n <pre>foo</pre>\n</blockquote>\n"
@@ -236,13 +263,14 @@ describe Wikitext::Parser, 'parsing PRE_START/PRE_END blocks' do
236
263
  @parser.parse('> </pre>').should == expected
237
264
  end
238
265
 
239
- it 'should ignore PRE_START inside UL blocks' do
266
+ it 'should break out of UL blocks on seeing PRE_START' do
240
267
  expected = dedent <<-END
241
268
  <ul>
242
- <li>&lt;pre&gt;</li>
269
+ <li>foo</li>
243
270
  </ul>
271
+ <pre>bar</pre>
244
272
  END
245
- @parser.parse('* <pre>').should == expected
273
+ @parser.parse('* foo<pre>bar</pre>').should == expected
246
274
  end
247
275
 
248
276
  it 'should ignore PRE_END inside UL blocks' do
@@ -254,13 +282,14 @@ describe Wikitext::Parser, 'parsing PRE_START/PRE_END blocks' do
254
282
  @parser.parse('* </pre>').should == expected
255
283
  end
256
284
 
257
- it 'should ignore PRE_START inside OL blocks' do
285
+ it 'should break out of OL blocks on seeing PRE_START' do
258
286
  expected = dedent <<-END
259
287
  <ol>
260
- <li>&lt;pre&gt;</li>
288
+ <li>foo</li>
261
289
  </ol>
290
+ <pre>bar</pre>
262
291
  END
263
- @parser.parse('# <pre>').should == expected
292
+ @parser.parse('# foo<pre>bar</pre>').should == expected
264
293
  end
265
294
 
266
295
  it 'should ignore PRE_END inside OL blocks' do
@@ -272,48 +301,78 @@ describe Wikitext::Parser, 'parsing PRE_START/PRE_END blocks' do
272
301
  @parser.parse('# </pre>').should == expected
273
302
  end
274
303
 
275
- it 'should ignore PRE_START inside H1 blocks' do
276
- @parser.parse('= <pre> =').should == "<h1>&lt;pre&gt;</h1>\n"
304
+ it 'should break out of H1 blocks on seeing PRE_START' do
305
+ expected = dedent <<-END
306
+ <h1>foo</h1>
307
+ <pre>bar</pre>
308
+ <p> =</p>
309
+ END
310
+ @parser.parse('= foo<pre>bar</pre> =').should == expected
277
311
  end
278
312
 
279
313
  it 'should ignore PRE_END inside H1 blocks' do
280
314
  @parser.parse('= </pre> =').should == "<h1>&lt;/pre&gt;</h1>\n"
281
315
  end
282
316
 
283
- it 'should ignore PRE_START inside H2 blocks' do
284
- @parser.parse('== <pre> ==').should == "<h2>&lt;pre&gt;</h2>\n"
317
+ it 'should break out of H2 blocks on seeing PRE_START' do
318
+ expected = dedent <<-END
319
+ <h2>foo</h2>
320
+ <pre>bar</pre>
321
+ <p> ==</p>
322
+ END
323
+ @parser.parse('== foo<pre>bar</pre> ==').should == expected
285
324
  end
286
325
 
287
326
  it 'should ignore PRE_END inside H2 blocks' do
288
327
  @parser.parse('== </pre> ==').should == "<h2>&lt;/pre&gt;</h2>\n"
289
328
  end
290
329
 
291
- it 'should ignore PRE_START inside H3 blocks' do
292
- @parser.parse('=== <pre> ===').should == "<h3>&lt;pre&gt;</h3>\n"
330
+ it 'should break out of H3 blocks on seeing PRE_START' do
331
+ expected = dedent <<-END
332
+ <h3>foo</h3>
333
+ <pre>bar</pre>
334
+ <p> ===</p>
335
+ END
336
+ @parser.parse('=== foo<pre>bar</pre> ===').should == expected
293
337
  end
294
338
 
295
339
  it 'should ignore PRE_END inside H3 blocks' do
296
340
  @parser.parse('=== </pre> ===').should == "<h3>&lt;/pre&gt;</h3>\n"
297
341
  end
298
342
 
299
- it 'should ignore PRE_START inside H4 blocks' do
300
- @parser.parse('==== <pre> ====').should == "<h4>&lt;pre&gt;</h4>\n"
343
+ it 'should break out of H4 blocks on seeing PRE_START' do
344
+ expected = dedent <<-END
345
+ <h4>foo</h4>
346
+ <pre>bar</pre>
347
+ <p> ====</p>
348
+ END
349
+ @parser.parse('==== foo<pre>bar</pre> ====').should == expected
301
350
  end
302
351
 
303
352
  it 'should ignore PRE_END inside H4 blocks' do
304
353
  @parser.parse('==== </pre> ====').should == "<h4>&lt;/pre&gt;</h4>\n"
305
354
  end
306
355
 
307
- it 'should ignore PRE_START inside H5 blocks' do
308
- @parser.parse('===== <pre> =====').should == "<h5>&lt;pre&gt;</h5>\n"
356
+ it 'should break out of H5 blocks on seeing PRE_START' do
357
+ expected = dedent <<-END
358
+ <h5>foo</h5>
359
+ <pre>bar</pre>
360
+ <p> =====</p>
361
+ END
362
+ @parser.parse('===== foo<pre>bar</pre> =====').should == expected
309
363
  end
310
364
 
311
365
  it 'should ignore PRE_END inside H5 blocks' do
312
366
  @parser.parse('===== </pre> =====').should == "<h5>&lt;/pre&gt;</h5>\n"
313
367
  end
314
368
 
315
- it 'should ignore PRE_START inside H6 blocks' do
316
- @parser.parse('====== <pre> ======').should == "<h6>&lt;pre&gt;</h6>\n"
369
+ it 'should break out of H6 blocks on seeing PRE_START' do
370
+ expected = dedent <<-END
371
+ <h6>foo</h6>
372
+ <pre>bar</pre>
373
+ <p> ======</p>
374
+ END
375
+ @parser.parse('====== foo<pre>bar</pre> ======').should == expected
317
376
  end
318
377
 
319
378
  it 'should ignore PRE_END inside H6 blocks' do
@@ -22,8 +22,8 @@ describe Wikitext::Parser, 'regressions' do
22
22
  @parser = Wikitext::Parser.new
23
23
  end
24
24
 
25
+ # turns out that this was never a bug in wikitext -- it was a bug in the host application -- but keeping the test does no harm
25
26
  it 'should correctly transform example #1' do
26
- # turns out that this was never a bug in wikitext: it was a bug in the host application
27
27
  input = dedent <<-END
28
28
  = Leopard =
29
29
 
@@ -42,4 +42,706 @@ describe Wikitext::Parser, 'regressions' do
42
42
  END
43
43
  @parser.parse(input).should == expected
44
44
  end
45
+
46
+ # discovered at: http://rails.wincent.com/wiki/nginx_log_rotation
47
+ # fixed by 0a328f1
48
+ it 'should allow empty lines in PRE blocks marked up with a leading space' do
49
+ input = dedent <<-END
50
+ # -d turns on debug mode: output is verbose, no actual changes are made to the log files
51
+ sudo logrotate -d /etc/logrotate.d/nginx
52
+
53
+ # if the debug output looks good, proceed with a real rotation (-v turns on verbose output)
54
+ sudo logrotate -v /etc/logrotate.d/nginx
55
+ END
56
+ expected = dedent <<-END
57
+ <pre># -d turns on debug mode: output is verbose, no actual changes are made to the log files
58
+ sudo logrotate -d /etc/logrotate.d/nginx
59
+
60
+ # if the debug output looks good, proceed with a real rotation (-v turns on verbose output)
61
+ sudo logrotate -v /etc/logrotate.d/nginx</pre>
62
+ END
63
+ @parser.parse(input).should == expected
64
+ end
65
+
66
+ # discovered at: http://rails.wincent.com/wiki/Installing_Ragel_5.2.0_on_Mac_OS_X_Tiger
67
+ # fixed by a616841
68
+ it 'should handle PRE_START blocks which follow unordered lists' do
69
+ input = dedent <<-END
70
+ * Get link to latest source code from: http://www.cs.queensu.ca/~thurston/ragel/
71
+
72
+ <pre>wget http://www.cs.queensu.ca/~thurston/ragel/ragel-5.20.tar.gz
73
+ tar xzvf ragel-5.20.tar.gz
74
+ cd ragel-5.20</pre>
75
+ END
76
+ expected = dedent <<-END
77
+ <ul>
78
+ <li>Get link to latest source code from: <a href="http://www.cs.queensu.ca/~thurston/ragel/" class="external">http://www.cs.queensu.ca/~thurston/ragel/</a></li>
79
+ </ul>
80
+ <pre>wget <a href="http://www.cs.queensu.ca/~thurston/ragel/ragel-5.20.tar.gz" class="external">http://www.cs.queensu.ca/~thurston/ragel/ragel-5.20.tar.gz</a>
81
+ tar xzvf ragel-5.20.tar.gz
82
+ cd ragel-5.20</pre>
83
+ END
84
+ @parser.parse(input).should == expected
85
+ end
86
+
87
+ # discovered at: http://rails.wincent.com/wiki/Movable_Type_security_notes
88
+ # fixed by a616841
89
+ it 'should handle PRE_START blocks which follow ordered lists' do
90
+ input = dedent <<-END
91
+ # Turn off the [[Movable Type]] search function; use Google instead (it's better anyway) with a form something like this:
92
+
93
+ <pre><form method="get"...></pre>
94
+ END
95
+ expected = dedent <<-END
96
+ <ol>
97
+ <li>Turn off the <a href="/wiki/Movable%20Type">Movable Type</a> search function; use Google instead (it's better anyway) with a form something like this:</li>
98
+ </ol>
99
+ <pre>&lt;form method=&quot;get&quot;...&gt;</pre>
100
+ END
101
+ @parser.parse(input).should == expected
102
+ end
103
+
104
+ # discovered at: http://rails.wincent.com/wiki/Movable_Type_security_notes
105
+ # fixed by 191b75d
106
+ it 'should respect additional indentation found inside PRE blocks' do
107
+ # note the two extra spaces on each line
108
+ input = dedent <<-END
109
+ <input type="text" name="q" size="20" maxlength="255" value="" />
110
+ <input type="hidden" name="hl" value="en" />
111
+ END
112
+
113
+ # problem is the spaces were being emitted _before_ the CRLF
114
+ expected = dedent <<-END
115
+ <pre> &lt;input type=&quot;text&quot; name=&quot;q&quot; size=&quot;20&quot; maxlength=&quot;255&quot; value=&quot;&quot; /&gt;
116
+ &lt;input type=&quot;hidden&quot; name=&quot;hl&quot; value=&quot;en&quot; /&gt;</pre>
117
+ END
118
+ @parser.parse(input).should == expected
119
+ end
120
+
121
+ # this is the general case of the bug covered in the previous spec
122
+ # any token that appears as the first token after a PRE token can manifest this bug
123
+ # PRINTABLE didn't only because it called _Wikitext_start_para_if_necessary(), which handled the pending CRLF
124
+ it 'should emit pending newlines for all token types found inside PRE and PRE_START blocks' do
125
+ # PRE_START
126
+ input = dedent <<-END
127
+ foo
128
+ <pre>bar
129
+ END
130
+ expected = dedent <<-END
131
+ <pre>foo
132
+ &lt;pre&gt;bar</pre>
133
+ END
134
+ @parser.parse(input).should == expected
135
+
136
+ # PRE_END
137
+ input = dedent <<-END
138
+ foo
139
+ </pre>bar
140
+ END
141
+ expected = dedent <<-END
142
+ <pre>foo
143
+ &lt;/pre&gt;bar</pre>
144
+ END
145
+ @parser.parse(input).should == expected
146
+
147
+ # BLOCKQUOTE_START
148
+ input = dedent <<-END
149
+ foo
150
+ <blockquote>bar
151
+ END
152
+ expected = dedent <<-END
153
+ <pre>foo
154
+ &lt;blockquote&gt;bar</pre>
155
+ END
156
+ @parser.parse(input).should == expected
157
+
158
+ # BLOCKQUOTE_END
159
+ input = dedent <<-END
160
+ foo
161
+ </blockquote>bar
162
+ END
163
+ expected = dedent <<-END
164
+ <pre>foo
165
+ &lt;/blockquote&gt;bar</pre>
166
+ END
167
+ @parser.parse(input).should == expected
168
+
169
+ # NO_WIKI_START
170
+ input = dedent <<-END
171
+ foo
172
+ <nowiki>bar
173
+ END
174
+ expected = dedent <<-END
175
+ <pre>foo
176
+ &lt;nowiki&gt;bar</pre>
177
+ END
178
+ @parser.parse(input).should == expected
179
+
180
+ # STRONG_EM
181
+ input = dedent <<-END
182
+ foo
183
+ '''''bar
184
+ END
185
+ expected = dedent <<-END
186
+ <pre>foo
187
+ '''''bar</pre>
188
+ END
189
+ @parser.parse(input).should == expected
190
+
191
+ # STRONG
192
+ input = dedent <<-END
193
+ foo
194
+ '''bar
195
+ END
196
+ expected = dedent <<-END
197
+ <pre>foo
198
+ '''bar</pre>
199
+ END
200
+ @parser.parse(input).should == expected
201
+
202
+ # STRONG_START
203
+ input = dedent <<-END
204
+ foo
205
+ <strong>bar
206
+ END
207
+ expected = dedent <<-END
208
+ <pre>foo
209
+ &lt;strong&gt;bar</pre>
210
+ END
211
+ @parser.parse(input).should == expected
212
+
213
+ # STRONG_END
214
+ input = dedent <<-END
215
+ foo
216
+ </strong>bar
217
+ END
218
+ expected = dedent <<-END
219
+ <pre>foo
220
+ &lt;/strong&gt;bar</pre>
221
+ END
222
+ @parser.parse(input).should == expected
223
+
224
+ # EM
225
+ input = dedent <<-END
226
+ foo
227
+ ''bar
228
+ END
229
+ expected = dedent <<-END
230
+ <pre>foo
231
+ ''bar</pre>
232
+ END
233
+ @parser.parse(input).should == expected
234
+
235
+ # EM_START
236
+ input = dedent <<-END
237
+ foo
238
+ <em>bar
239
+ END
240
+ expected = dedent <<-END
241
+ <pre>foo
242
+ &lt;em&gt;bar</pre>
243
+ END
244
+ @parser.parse(input).should == expected
245
+
246
+ # EM_END
247
+ input = dedent <<-END
248
+ foo
249
+ </em>bar
250
+ END
251
+ expected = dedent <<-END
252
+ <pre>foo
253
+ &lt;/em&gt;bar</pre>
254
+ END
255
+ @parser.parse(input).should == expected
256
+
257
+ # TT
258
+ input = dedent <<-END
259
+ foo
260
+ `bar
261
+ END
262
+ expected = dedent <<-END
263
+ <pre>foo
264
+ `bar</pre>
265
+ END
266
+ @parser.parse(input).should == expected
267
+
268
+ # TT_START
269
+ input = dedent <<-END
270
+ foo
271
+ <tt>bar
272
+ END
273
+ expected = dedent <<-END
274
+ <pre>foo
275
+ &lt;tt&gt;bar</pre>
276
+ END
277
+ @parser.parse(input).should == expected
278
+
279
+ # TT_END
280
+ input = dedent <<-END
281
+ foo
282
+ </tt>bar
283
+ END
284
+ expected = dedent <<-END
285
+ <pre>foo
286
+ &lt;/tt&gt;bar</pre>
287
+ END
288
+ @parser.parse(input).should == expected
289
+
290
+ # H6_END
291
+ input = dedent <<-END
292
+ foo
293
+ ======
294
+ bar
295
+ END
296
+ expected = dedent <<-END
297
+ <pre>foo
298
+ ======
299
+ bar</pre>
300
+ END
301
+ @parser.parse(input).should == expected
302
+
303
+ # H5_END
304
+ input = dedent <<-END
305
+ foo
306
+ =====
307
+ bar
308
+ END
309
+ expected = dedent <<-END
310
+ <pre>foo
311
+ =====
312
+ bar</pre>
313
+ END
314
+ @parser.parse(input).should == expected
315
+
316
+ # H4_END
317
+ input = dedent <<-END
318
+ foo
319
+ ====
320
+ bar
321
+ END
322
+ expected = dedent <<-END
323
+ <pre>foo
324
+ ====
325
+ bar</pre>
326
+ END
327
+ @parser.parse(input).should == expected
328
+
329
+ # H3_END
330
+ input = dedent <<-END
331
+ foo
332
+ ===
333
+ bar
334
+ END
335
+ expected = dedent <<-END
336
+ <pre>foo
337
+ ===
338
+ bar</pre>
339
+ END
340
+ @parser.parse(input).should == expected
341
+
342
+ # H2_END
343
+ input = dedent <<-END
344
+ foo
345
+ ==
346
+ bar
347
+ END
348
+ expected = dedent <<-END
349
+ <pre>foo
350
+ ==
351
+ bar</pre>
352
+ END
353
+ @parser.parse(input).should == expected
354
+
355
+ # H1_END
356
+ input = dedent <<-END
357
+ foo
358
+ =
359
+ bar
360
+ END
361
+ expected = dedent <<-END
362
+ <pre>foo
363
+ =
364
+ bar</pre>
365
+ END
366
+ @parser.parse(input).should == expected
367
+
368
+ # MAIL
369
+ input = dedent <<-END
370
+ foo
371
+ bar@baz.com
372
+ END
373
+ expected = dedent <<-END
374
+ <pre>foo
375
+ bar@baz.com</pre>
376
+ END
377
+ @parser.parse(input).should == expected
378
+
379
+ # LINK_START
380
+ input = dedent <<-END
381
+ foo
382
+ [[bar
383
+ END
384
+ expected = dedent <<-END
385
+ <pre>foo
386
+ [[bar</pre>
387
+ END
388
+ @parser.parse(input).should == expected
389
+
390
+ # LINK_END
391
+ input = dedent <<-END
392
+ foo
393
+ ]]bar
394
+ END
395
+ expected = dedent <<-END
396
+ <pre>foo
397
+ ]]bar</pre>
398
+ END
399
+ @parser.parse(input).should == expected
400
+
401
+ # EXT_LINK_START
402
+ input = dedent <<-END
403
+ foo
404
+ [bar
405
+ END
406
+ expected = dedent <<-END
407
+ <pre>foo
408
+ [bar</pre>
409
+ END
410
+ @parser.parse(input).should == expected
411
+
412
+ # EXT_LINK_END
413
+ input = dedent <<-END
414
+ foo
415
+ ]bar
416
+ END
417
+ expected = dedent <<-END
418
+ <pre>foo
419
+ ]bar</pre>
420
+ END
421
+ @parser.parse(input).should == expected
422
+
423
+ # IMG_START
424
+ input = dedent <<-END
425
+ foo
426
+ {{bar
427
+ END
428
+ expected = dedent <<-END
429
+ <pre>foo
430
+ {{bar</pre>
431
+ END
432
+ @parser.parse(input).should == expected
433
+
434
+ # these tokens weren't affected by the bug, seeing as they either call _Wikitext_start_para_if_necessary()
435
+ # or they can only appear in PRE_START (not PRE) thanks to the tokenizer
436
+ # but we add specs for them to make sure that the issue never crops up for them in the future
437
+
438
+ # PRE (in PRE_START)
439
+ input = dedent <<-END
440
+ <pre>foo
441
+ bar</pre>
442
+ END
443
+ expected = dedent <<-END
444
+ <pre>foo
445
+ bar</pre>
446
+ END
447
+ @parser.parse(input).should == expected
448
+
449
+ # BLOCKQUOTE (in PRE_START)
450
+ input = dedent <<-END
451
+ <pre>foo
452
+ > bar</pre>
453
+ END
454
+ expected = dedent <<-END
455
+ <pre>foo
456
+ &gt; bar</pre>
457
+ END
458
+ @parser.parse(input).should == expected
459
+
460
+ # OL (in PRE_START)
461
+ input = dedent <<-END
462
+ <pre># foo
463
+ # bar</pre>
464
+ END
465
+ expected = dedent <<-END
466
+ <pre># foo
467
+ # bar</pre>
468
+ END
469
+ @parser.parse(input).should == expected
470
+
471
+ # UL (in PRE_START)
472
+ input = dedent <<-END
473
+ <pre>* foo
474
+ * bar</pre>
475
+ END
476
+ expected = dedent <<-END
477
+ <pre>* foo
478
+ * bar</pre>
479
+ END
480
+ @parser.parse(input).should == expected
481
+
482
+ # H6_START (in PRE_START)
483
+ input = dedent <<-END
484
+ <pre>foo
485
+ ====== bar
486
+ baz</pre>
487
+ END
488
+ expected = dedent <<-END
489
+ <pre>foo
490
+ ====== bar
491
+ baz</pre>
492
+ END
493
+ @parser.parse(input).should == expected
494
+
495
+ # H5_START (in PRE_START)
496
+ input = dedent <<-END
497
+ <pre>foo
498
+ ===== bar
499
+ baz</pre>
500
+ END
501
+ expected = dedent <<-END
502
+ <pre>foo
503
+ ===== bar
504
+ baz</pre>
505
+ END
506
+ @parser.parse(input).should == expected
507
+
508
+ # H4_START (in PRE_START)
509
+ input = dedent <<-END
510
+ <pre>foo
511
+ ==== bar
512
+ baz</pre>
513
+ END
514
+ expected = dedent <<-END
515
+ <pre>foo
516
+ ==== bar
517
+ baz</pre>
518
+ END
519
+ @parser.parse(input).should == expected
520
+
521
+ # H3_START (in PRE_START)
522
+ input = dedent <<-END
523
+ <pre>foo
524
+ === bar
525
+ baz</pre>
526
+ END
527
+ expected = dedent <<-END
528
+ <pre>foo
529
+ === bar
530
+ baz</pre>
531
+ END
532
+ @parser.parse(input).should == expected
533
+
534
+ # H2_START (in PRE_START)
535
+ input = dedent <<-END
536
+ <pre>foo
537
+ == bar
538
+ baz</pre>
539
+ END
540
+ expected = dedent <<-END
541
+ <pre>foo
542
+ == bar
543
+ baz</pre>
544
+ END
545
+ @parser.parse(input).should == expected
546
+
547
+ # H1_START (in PRE_START)
548
+ input = dedent <<-END
549
+ <pre>foo
550
+ = bar
551
+ baz</pre>
552
+ END
553
+ expected = dedent <<-END
554
+ <pre>foo
555
+ = bar
556
+ baz</pre>
557
+ END
558
+ @parser.parse(input).should == expected
559
+
560
+ # NO_WIKI_END
561
+ input = dedent <<-END
562
+ foo
563
+ </nowiki>bar
564
+ END
565
+ expected = dedent <<-END
566
+ <pre>foo
567
+ &lt;/nowiki&gt;bar</pre>
568
+ END
569
+ @parser.parse(input).should == expected
570
+
571
+ # SEPARATOR
572
+ input = dedent <<-END
573
+ foo
574
+ |bar
575
+ END
576
+ expected = dedent <<-END
577
+ <pre>foo
578
+ |bar</pre>
579
+ END
580
+ @parser.parse(input).should == expected
581
+
582
+ # QUOT_ENTITY
583
+ input = dedent <<-END
584
+ foo
585
+ &quot;bar
586
+ END
587
+ expected = dedent <<-END
588
+ <pre>foo
589
+ &quot;bar</pre>
590
+ END
591
+ @parser.parse(input).should == expected
592
+
593
+ # AMP_ENTITY
594
+ input = dedent <<-END
595
+ foo
596
+ &amp;bar
597
+ END
598
+ expected = dedent <<-END
599
+ <pre>foo
600
+ &amp;bar</pre>
601
+ END
602
+ @parser.parse(input).should == expected
603
+
604
+ # NAMED_ENTITY
605
+ input = dedent <<-END
606
+ foo
607
+ &raquo;bar
608
+ END
609
+ expected = dedent <<-END
610
+ <pre>foo
611
+ &raquo;bar</pre>
612
+ END
613
+ @parser.parse(input).should == expected
614
+
615
+ # DECIMAL_ENTITY
616
+ input = dedent <<-END
617
+ foo
618
+ &#1234;bar
619
+ END
620
+ expected = dedent <<-END
621
+ <pre>foo
622
+ &#1234;bar</pre>
623
+ END
624
+ @parser.parse(input).should == expected
625
+
626
+ # HEX_ENTITY
627
+ input = dedent <<-END
628
+ foo
629
+ &#x2022;bar
630
+ END
631
+ expected = dedent <<-END
632
+ <pre>foo
633
+ &#x2022;bar</pre>
634
+ END
635
+ @parser.parse(input).should == expected
636
+
637
+ # QUOT
638
+ input = dedent <<-END
639
+ foo
640
+ "bar
641
+ END
642
+ expected = dedent <<-END
643
+ <pre>foo
644
+ &quot;bar</pre>
645
+ END
646
+ @parser.parse(input).should == expected
647
+
648
+ # AMP
649
+ input = dedent <<-END
650
+ foo
651
+ &bar
652
+ END
653
+ expected = dedent <<-END
654
+ <pre>foo
655
+ &amp;bar</pre>
656
+ END
657
+ @parser.parse(input).should == expected
658
+
659
+ # LESS
660
+ input = dedent <<-END
661
+ foo
662
+ <bar
663
+ END
664
+ expected = dedent <<-END
665
+ <pre>foo
666
+ &lt;bar</pre>
667
+ END
668
+ @parser.parse(input).should == expected
669
+
670
+ # GREATER
671
+ input = dedent <<-END
672
+ foo
673
+ >bar
674
+ END
675
+ expected = dedent <<-END
676
+ <pre>foo
677
+ &gt;bar</pre>
678
+ END
679
+ @parser.parse(input).should == expected
680
+
681
+ # URI
682
+ input = dedent <<-END
683
+ foo
684
+ http://example.com/
685
+ END
686
+ expected = dedent <<-END
687
+ <pre>foo
688
+ <a href="http://example.com/" class="external">http://example.com/</a></pre>
689
+ END
690
+ @parser.parse(input).should == expected
691
+
692
+ # PRINTABLE
693
+ input = dedent <<-END
694
+ foo
695
+ bar
696
+ END
697
+ expected = dedent <<-END
698
+ <pre>foo
699
+ bar</pre>
700
+ END
701
+ @parser.parse(input).should == expected
702
+
703
+ # IMG_END
704
+ input = dedent <<-END
705
+ foo
706
+ }}bar
707
+ END
708
+ expected = dedent <<-END
709
+ <pre>foo
710
+ }}bar</pre>
711
+ END
712
+ @parser.parse(input).should == expected
713
+
714
+ # LEFT_CURLY
715
+ input = dedent <<-END
716
+ foo
717
+ {bar
718
+ END
719
+ expected = dedent <<-END
720
+ <pre>foo
721
+ {bar</pre>
722
+ END
723
+ @parser.parse(input).should == expected
724
+
725
+ # RIGHT_CURLY
726
+ input = dedent <<-END
727
+ foo
728
+ }bar
729
+ END
730
+ expected = dedent <<-END
731
+ <pre>foo
732
+ }bar</pre>
733
+ END
734
+ @parser.parse(input).should == expected
735
+
736
+ # DEFAULT
737
+ input = dedent <<-END
738
+ foo
739
+ €bar
740
+ END
741
+ expected = dedent <<-END
742
+ <pre>foo
743
+ &#x20ac;bar</pre>
744
+ END
745
+ @parser.parse(input).should == expected
746
+ end
45
747
  end