]> git.wincent.com - wikitext.git/blob - spec/autolinking_spec.rb
Ensure ampersands in URIs are adequately entified
[wikitext.git] / spec / autolinking_spec.rb
1 # Copyright 2007-2012 Wincent Colaiuta. All rights reserved.
2 #
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions are met:
5 #
6 # 1. Redistributions of source code must retain the above copyright notice,
7 #    this list of conditions and the following disclaimer.
8 # 2. Redistributions in binary form must reproduce the above copyright notice,
9 #    this list of conditions and the following disclaimer in the documentation
10 #    and/or other materials provided with the distribution.
11
12 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
13 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
16 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
17 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
18 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
19 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
20 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
21 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
22 # POSSIBILITY OF SUCH DAMAGE.
23
24 require 'spec_helper'
25
26 describe Wikitext::Parser, 'autolinking' do
27   before do
28     @parser = Wikitext::Parser.new
29   end
30
31   it 'should default to autolinking on' do
32     @parser.autolink.should == true
33   end
34
35   describe 'on' do
36     it 'should convert HTTP URIs into hyperlinks' do
37       uri = 'http://example.com/'
38       @parser.parse(uri).should == %Q{<p><a href="http://example.com/" class="external">http://example.com/</a></p>\n}
39     end
40
41     it 'should convert HTTPS URIs into hyperlinks' do
42       uri = 'https://example.com/'
43       @parser.parse(uri).should == %Q{<p><a href="https://example.com/" class="external">https://example.com/</a></p>\n}
44     end
45
46     it 'should convert FTP URIs into hyperlinks' do
47       uri = 'ftp://example.com/'
48       @parser.parse(uri).should == %Q{<p><a href="ftp://example.com/" class="external">ftp://example.com/</a></p>\n}
49     end
50
51     it 'should convert mailto URIs into hyperlinks' do
52       uri = 'mailto:user@example.com'
53       @parser.parse(uri).should == %Q{<p><a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a></p>\n}
54     end
55
56     it 'should convert SVN URIs into hyperlinks' do
57       uri = 'svn://example.com/'
58       @parser.parse(uri).should == %Q{<p><a href="svn://example.com/" class="external">svn://example.com/</a></p>\n}
59     end
60
61     it 'converts ampersands into entities' do
62       expected = %{<p><a href="http://google.com/?q=1&amp;lang=en" class="external">http://google.com/?q=1&amp;lang=en</a></p>\n}
63       @parser.parse('http://google.com/?q=1&lang=en').should == expected
64     end
65
66     it 'should apply the external_link_class CSS class if set' do
67       uri = 'http://example.com/'
68       @parser.external_link_class = 'bar'
69       @parser.parse(uri).should == %Q{<p><a href="http://example.com/" class="bar">http://example.com/</a></p>\n}
70     end
71
72     it 'should apply no CSS if external_link_class is set to nil' do
73       uri = 'http://example.com/'
74       @parser.external_link_class = nil
75       @parser.parse(uri).should == %Q{<p><a href="http://example.com/">http://example.com/</a></p>\n}
76     end
77
78     it 'should pass through URIs unchanged inside <nowiki></nowiki> spans' do
79       @parser.parse("<nowiki>http://example.com/</nowiki>").should == "<p>http://example.com/</p>\n"
80     end
81
82     it 'should autolink URIs inside <pre></pre> spans' do
83       input     = ' http://example.com/'
84       expected  = %Q{<pre><a href="http://example.com/" class="external">http://example.com/</a></pre>\n}
85       @parser.parse(input).should == expected
86       @parser.external_link_class = nil
87       expected  = %Q{<pre><a href="http://example.com/">http://example.com/</a></pre>\n}
88       @parser.parse(input).should == expected
89     end
90
91     it 'should convert emails into hyperlinks' do
92       uri = 'user@example.com'
93       @parser.parse(uri).should == %Q{<p><a href="mailto:user@example.com" class="mailto">user@example.com</a></p>\n}
94     end
95
96     it 'should apply the mailto CSS class if set (raw address)' do
97       uri = 'user@example.com'
98       @parser.mailto_class = 'foo'
99       @parser.parse(uri).should == %Q{<p><a href="mailto:user@example.com" class="foo">user@example.com</a></p>\n}
100     end
101
102     it 'should apply the mailto CSS class if set (mailto URI)' do
103       uri = 'mailto:user@example.com'
104       @parser.mailto_class = 'foo'
105       @parser.parse(uri).should == %Q{<p><a href="mailto:user@example.com" class="foo">mailto:user@example.com</a></p>\n}
106     end
107
108     it 'should apply no CSS if the mailto class is set to nil (raw address)' do
109       uri = 'user@example.com'
110       @parser.mailto_class = nil
111       @parser.parse(uri).should == %Q{<p><a href="mailto:user@example.com">user@example.com</a></p>\n}
112     end
113
114     it 'should apply no CSS if the mailto class is set to nil (mailto URI)' do
115       uri = 'mailto:user@example.com'
116       @parser.mailto_class = nil
117       @parser.parse(uri).should == %Q{<p><a href="mailto:user@example.com">mailto:user@example.com</a></p>\n}
118     end
119
120     it 'should pass through emails unchanged inside <nowiki></nowiki> spans' do
121       @parser.parse("<nowiki>user@example.com</nowiki>").should == "<p>user@example.com</p>\n"  # was a crasher
122     end
123
124     it 'should pass through emails unchanged inside <pre></pre> blocks' do
125       @parser.parse(" user@example.com").should == "<pre>user@example.com</pre>\n"  # was a crasher
126     end
127   end
128
129   describe 'off' do
130     before do
131       @parser.autolink = false
132     end
133
134     it 'should accept "autolink = false"' do
135       @parser.autolink.should == false
136     end
137
138     it 'should not convert URIs into hyperlinks' do
139       @parser.parse('http://example.com/').should == "<p>http://example.com/</p>\n"
140     end
141
142     it 'should not convert emails into hyperlinks' do
143       @parser.parse('user@example.com').should == "<p>user@example.com</p>\n"
144     end
145   end
146
147   # "special" URI characters are characters that are valid _within_ a URI
148   # but if they appear as delimiters (at the end of a URI) we want them to be excluded from the URI
149   describe 'handling "special" URI characters' do
150     describe 'after HTTP URIs' do
151       it 'should terminate if followed by a period' do
152         input     = 'Try http://example.com/.'
153         expected  = %Q{<p>Try <a href="http://example.com/" class="external">http://example.com/</a>.</p>\n}
154         @parser.parse(input).should == expected
155       end
156
157       it 'should not terminate on periods that occur within the URI' do
158         input     = 'Try http://www.example.com/.'
159         expected  = %Q{<p>Try <a href="http://www.example.com/" class="external">http://www.example.com/</a>.</p>\n}
160         @parser.parse(input).should == expected
161       end
162
163       it 'should terminate if followed by a colon' do
164         input     = 'Try http://example.com/:'
165         expected  = %Q{<p>Try <a href="http://example.com/" class="external">http://example.com/</a>:</p>\n}
166         @parser.parse(input).should == expected
167       end
168
169       it 'should not terminate on colons that occur within the URI' do
170         input     = 'Try http://example.com:3000/.'
171         expected  = %Q{<p>Try <a href="http://example.com:3000/" class="external">http://example.com:3000/</a>.</p>\n}
172         @parser.parse(input).should == expected
173       end
174
175       it 'should terminate if followed by a comma' do
176         input     = 'Try http://example.com/,'
177         expected  = %Q{<p>Try <a href="http://example.com/" class="external">http://example.com/</a>,</p>\n}
178         @parser.parse(input).should == expected
179       end
180
181       it 'should not terminate on commas that occur within the URI' do
182         input     = 'Try http://example.com/2008,10,12,index.html.'
183         expected  = %Q{<p>Try <a href="http://example.com/2008,10,12,index.html" class="external">http://example.com/2008,10,12,index.html</a>.</p>\n}
184         @parser.parse(input).should == expected
185       end
186
187       it 'should terminate if followed by an exclamation mark' do
188         input     = 'Try http://example.com/!'
189         expected  = %Q{<p>Try <a href="http://example.com/" class="external">http://example.com/</a>!</p>\n}
190         @parser.parse(input).should == expected
191       end
192
193       it 'should not terminate on exclamation marks that occur within the URI' do
194         input     = 'Try http://example.com/fun!.html.'
195         expected  = %Q{<p>Try <a href="http://example.com/fun!.html" class="external">http://example.com/fun!.html</a>.</p>\n}
196         @parser.parse(input).should == expected
197       end
198
199       it 'should terminate if followed by a question mark' do
200         input     = 'Try http://example.com/?'
201         expected  = %Q{<p>Try <a href="http://example.com/" class="external">http://example.com/</a>?</p>\n}
202         @parser.parse(input).should == expected
203       end
204
205       it 'should not terminate on question marks that occur within the URI' do
206         input     = 'Try http://example.com/fun.html?q=foo.'
207         expected  = %Q{<p>Try <a href="http://example.com/fun.html?q=foo" class="external">http://example.com/fun.html?q=foo</a>.</p>\n}
208         @parser.parse(input).should == expected
209       end
210
211       it 'should terminate if followed by a semi-colon' do
212         input     = 'Try http://example.com/;'
213         expected  = %Q{<p>Try <a href="http://example.com/" class="external">http://example.com/</a>;</p>\n}
214         @parser.parse(input).should == expected
215       end
216
217       it 'should not terminate on semi-colons that occur within the URI' do
218         input     = 'Try http://example.com/fun;edit.'
219         expected  = %Q{<p>Try <a href="http://example.com/fun;edit" class="external">http://example.com/fun;edit</a>.</p>\n}
220         @parser.parse(input).should == expected
221       end
222
223       it 'should terminate if followed by a right parenthesis' do
224         input     = '(Try http://example.com/)'
225         expected  = %Q{<p>(Try <a href="http://example.com/" class="external">http://example.com/</a>)</p>\n}
226         @parser.parse(input).should == expected
227       end
228
229       it 'should not terminate on right-parentheses that occur within the URI' do
230         input     = 'Try http://example.com/(fun).html.'
231         expected  = %Q{<p>Try <a href="http://example.com/(fun).html" class="external">http://example.com/(fun).html</a>.</p>\n}
232         @parser.parse(input).should == expected
233       end
234     end
235
236     describe 'after HTTPS URIs' do
237       it 'should terminate if followed by a period' do
238         input     = 'Try https://example.com/.'
239         expected  = %Q{<p>Try <a href="https://example.com/" class="external">https://example.com/</a>.</p>\n}
240         @parser.parse(input).should == expected
241       end
242
243       it 'should not terminate on periods that occur within the URI' do
244         input     = 'Try https://www.example.com/.'
245         expected  = %Q{<p>Try <a href="https://www.example.com/" class="external">https://www.example.com/</a>.</p>\n}
246         @parser.parse(input).should == expected
247       end
248
249       it 'should terminate if followed by a colon' do
250         input     = 'Try https://example.com/:'
251         expected  = %Q{<p>Try <a href="https://example.com/" class="external">https://example.com/</a>:</p>\n}
252         @parser.parse(input).should == expected
253       end
254
255       it 'should not terminate on colons that occur within the URI' do
256         input     = 'Try https://example.com:3000/.'
257         expected  = %Q{<p>Try <a href="https://example.com:3000/" class="external">https://example.com:3000/</a>.</p>\n}
258         @parser.parse(input).should == expected
259       end
260
261       it 'should terminate if followed by a comma' do
262         input     = 'Try https://example.com/,'
263         expected  = %Q{<p>Try <a href="https://example.com/" class="external">https://example.com/</a>,</p>\n}
264         @parser.parse(input).should == expected
265       end
266
267       it 'should not terminate on commas that occur within the URI' do
268         input     = 'Try https://example.com/2008,10,12,index.html.'
269         expected  = %Q{<p>Try <a href="https://example.com/2008,10,12,index.html" class="external">https://example.com/2008,10,12,index.html</a>.</p>\n}
270         @parser.parse(input).should == expected
271       end
272
273       it 'should terminate if followed by an exclamation mark' do
274         input     = 'Try https://example.com/!'
275         expected  = %Q{<p>Try <a href="https://example.com/" class="external">https://example.com/</a>!</p>\n}
276         @parser.parse(input).should == expected
277       end
278
279       it 'should not terminate on exclamation marks that occur within the URI' do
280         input     = 'Try https://example.com/fun!.html.'
281         expected  = %Q{<p>Try <a href="https://example.com/fun!.html" class="external">https://example.com/fun!.html</a>.</p>\n}
282         @parser.parse(input).should == expected
283       end
284
285       it 'should terminate if followed by a question mark' do
286         input     = 'Try https://example.com/?'
287         expected  = %Q{<p>Try <a href="https://example.com/" class="external">https://example.com/</a>?</p>\n}
288         @parser.parse(input).should == expected
289       end
290
291       it 'should not terminate on question marks that occur within the URI' do
292         input     = 'Try https://example.com/fun.html?q=foo.'
293         expected  = %Q{<p>Try <a href="https://example.com/fun.html?q=foo" class="external">https://example.com/fun.html?q=foo</a>.</p>\n}
294         @parser.parse(input).should == expected
295       end
296
297       it 'should terminate if followed by a semi-colon' do
298         input     = 'Try https://example.com/;'
299         expected  = %Q{<p>Try <a href="https://example.com/" class="external">https://example.com/</a>;</p>\n}
300         @parser.parse(input).should == expected
301       end
302
303       it 'should not terminate on semi-colons that occur within the URI' do
304         input     = 'Try https://example.com/fun;edit.'
305         expected  = %Q{<p>Try <a href="https://example.com/fun;edit" class="external">https://example.com/fun;edit</a>.</p>\n}
306         @parser.parse(input).should == expected
307       end
308
309       it 'should terminate if followed by a right parenthesis' do
310         input     = '(Try https://example.com/)'
311         expected  = %Q{<p>(Try <a href="https://example.com/" class="external">https://example.com/</a>)</p>\n}
312         @parser.parse(input).should == expected
313       end
314
315       it 'should not terminate on right-parentheses that occur within the URI' do
316         input     = 'Try https://example.com/(fun).html.'
317         expected  = %Q{<p>Try <a href="https://example.com/(fun).html" class="external">https://example.com/(fun).html</a>.</p>\n}
318         @parser.parse(input).should == expected
319       end
320     end
321
322     # note: these are just like the HTTP specs seeing as both URI types are treated the same syntactically
323     # (even though these aren't "real" FTP URIs)
324     describe 'after FTP URIs' do
325       it 'should terminate if followed by a period' do
326         input     = 'Try ftp://example.com/.'
327         expected  = %Q{<p>Try <a href="ftp://example.com/" class="external">ftp://example.com/</a>.</p>\n}
328         @parser.parse(input).should == expected
329       end
330
331       it 'should not terminate on periods that occur within the URI' do
332         input     = 'Try ftp://www.example.com/.'
333         expected  = %Q{<p>Try <a href="ftp://www.example.com/" class="external">ftp://www.example.com/</a>.</p>\n}
334         @parser.parse(input).should == expected
335       end
336
337       it 'should terminate if followed by a colon' do
338         input     = 'Try ftp://example.com/:'
339         expected  = %Q{<p>Try <a href="ftp://example.com/" class="external">ftp://example.com/</a>:</p>\n}
340         @parser.parse(input).should == expected
341       end
342
343       it 'should not terminate on colons that occur within the URI' do
344         input     = 'Try ftp://example.com:3000/.'
345         expected  = %Q{<p>Try <a href="ftp://example.com:3000/" class="external">ftp://example.com:3000/</a>.</p>\n}
346         @parser.parse(input).should == expected
347       end
348
349       it 'should terminate if followed by a comma' do
350         input     = 'Try ftp://example.com/,'
351         expected  = %Q{<p>Try <a href="ftp://example.com/" class="external">ftp://example.com/</a>,</p>\n}
352         @parser.parse(input).should == expected
353       end
354
355       it 'should not terminate on commas that occur within the URI' do
356         input     = 'Try ftp://example.com/2008,10,12,index.html.'
357         expected  = %Q{<p>Try <a href="ftp://example.com/2008,10,12,index.html" class="external">ftp://example.com/2008,10,12,index.html</a>.</p>\n}
358         @parser.parse(input).should == expected
359       end
360
361       it 'should terminate if followed by an exclamation mark' do
362         input     = 'Try ftp://example.com/!'
363         expected  = %Q{<p>Try <a href="ftp://example.com/" class="external">ftp://example.com/</a>!</p>\n}
364         @parser.parse(input).should == expected
365       end
366
367       it 'should not terminate on exclamation marks that occur within the URI' do
368         input     = 'Try ftp://example.com/fun!.html.'
369         expected  = %Q{<p>Try <a href="ftp://example.com/fun!.html" class="external">ftp://example.com/fun!.html</a>.</p>\n}
370         @parser.parse(input).should == expected
371       end
372
373       it 'should terminate if followed by a question mark' do
374         input     = 'Try ftp://example.com/?'
375         expected  = %Q{<p>Try <a href="ftp://example.com/" class="external">ftp://example.com/</a>?</p>\n}
376         @parser.parse(input).should == expected
377       end
378
379       it 'should not terminate on question marks that occur within the URI' do
380         input     = 'Try ftp://example.com/fun.html?q=foo.'
381         expected  = %Q{<p>Try <a href="ftp://example.com/fun.html?q=foo" class="external">ftp://example.com/fun.html?q=foo</a>.</p>\n}
382         @parser.parse(input).should == expected
383       end
384
385       it 'should terminate if followed by a semi-colon' do
386         input     = 'Try ftp://example.com/;'
387         expected  = %Q{<p>Try <a href="ftp://example.com/" class="external">ftp://example.com/</a>;</p>\n}
388         @parser.parse(input).should == expected
389       end
390
391       it 'should not terminate on semi-colons that occur within the URI' do
392         input     = 'Try ftp://example.com/fun;edit.'
393         expected  = %Q{<p>Try <a href="ftp://example.com/fun;edit" class="external">ftp://example.com/fun;edit</a>.</p>\n}
394         @parser.parse(input).should == expected
395       end
396
397       it 'should terminate if followed by a right parenthesis' do
398         input     = '(Try ftp://example.com/)'
399         expected  = %Q{<p>(Try <a href="ftp://example.com/" class="external">ftp://example.com/</a>)</p>\n}
400         @parser.parse(input).should == expected
401       end
402
403       it 'should not terminate on right-parentheses that occur within the URI' do
404         input     = 'Try ftp://example.com/(fun).html.'
405         expected  = %Q{<p>Try <a href="ftp://example.com/(fun).html" class="external">ftp://example.com/(fun).html</a>.</p>\n}
406         @parser.parse(input).should == expected
407       end
408     end
409
410     # note: these are just like the HTTP specs seeing as both URI types are treated the same syntactically
411     # (even though these aren't "real" SVN URIs)
412     describe 'after SVN URIs' do
413       it 'should terminate if followed by a period' do
414         input     = 'Try svn://example.com/.'
415         expected  = %Q{<p>Try <a href="svn://example.com/" class="external">svn://example.com/</a>.</p>\n}
416         @parser.parse(input).should == expected
417       end
418
419       it 'should not terminate on periods that occur within the URI' do
420         input     = 'Try svn://www.example.com/.'
421         expected  = %Q{<p>Try <a href="svn://www.example.com/" class="external">svn://www.example.com/</a>.</p>\n}
422         @parser.parse(input).should == expected
423       end
424
425       it 'should terminate if followed by a colon' do
426         input     = 'Try svn://example.com/:'
427         expected  = %Q{<p>Try <a href="svn://example.com/" class="external">svn://example.com/</a>:</p>\n}
428         @parser.parse(input).should == expected
429       end
430
431       it 'should not terminate on colons that occur within the URI' do
432         input     = 'Try svn://example.com:3000/.'
433         expected  = %Q{<p>Try <a href="svn://example.com:3000/" class="external">svn://example.com:3000/</a>.</p>\n}
434         @parser.parse(input).should == expected
435       end
436
437       it 'should terminate if followed by a comma' do
438         input     = 'Try svn://example.com/,'
439         expected  = %Q{<p>Try <a href="svn://example.com/" class="external">svn://example.com/</a>,</p>\n}
440         @parser.parse(input).should == expected
441       end
442
443       it 'should not terminate on commas that occur within the URI' do
444         input     = 'Try svn://example.com/2008,10,12,index.html.'
445         expected  = %Q{<p>Try <a href="svn://example.com/2008,10,12,index.html" class="external">svn://example.com/2008,10,12,index.html</a>.</p>\n}
446         @parser.parse(input).should == expected
447       end
448
449       it 'should terminate if followed by an exclamation mark' do
450         input     = 'Try svn://example.com/!'
451         expected  = %Q{<p>Try <a href="svn://example.com/" class="external">svn://example.com/</a>!</p>\n}
452         @parser.parse(input).should == expected
453       end
454
455       it 'should not terminate on exclamation marks that occur within the URI' do
456         input     = 'Try svn://example.com/fun!.html.'
457         expected  = %Q{<p>Try <a href="svn://example.com/fun!.html" class="external">svn://example.com/fun!.html</a>.</p>\n}
458         @parser.parse(input).should == expected
459       end
460
461       it 'should terminate if followed by a question mark' do
462         input     = 'Try svn://example.com/?'
463         expected  = %Q{<p>Try <a href="svn://example.com/" class="external">svn://example.com/</a>?</p>\n}
464         @parser.parse(input).should == expected
465       end
466
467       it 'should not terminate on question marks that occur within the URI' do
468         input     = 'Try svn://example.com/fun.html?q=foo'
469         expected  = %Q{<p>Try <a href="svn://example.com/fun.html?q=foo" class="external">svn://example.com/fun.html?q=foo</a></p>\n}
470         @parser.parse(input).should == expected
471       end
472
473       it 'should terminate if followed by a semi-colon' do
474         input     = 'Try svn://example.com/;'
475         expected  = %Q{<p>Try <a href="svn://example.com/" class="external">svn://example.com/</a>;</p>\n}
476         @parser.parse(input).should == expected
477       end
478
479       it 'should not terminate on semi-colons that occur within the URI' do
480         input     = 'Try svn://example.com/fun;edit.'
481         expected  = %Q{<p>Try <a href="svn://example.com/fun;edit" class="external">svn://example.com/fun;edit</a>.</p>\n}
482         @parser.parse(input).should == expected
483       end
484
485       it 'should terminate if followed by a right parenthesis' do
486         input     = '(Try svn://example.com/)'
487         expected  = %Q{<p>(Try <a href="svn://example.com/" class="external">svn://example.com/</a>)</p>\n}
488         @parser.parse(input).should == expected
489       end
490
491       it 'should not terminate on right-parentheses that occur within the URI' do
492         input     = 'Try svn://example.com/(fun).html.'
493         expected  = %Q{<p>Try <a href="svn://example.com/(fun).html" class="external">svn://example.com/(fun).html</a>.</p>\n}
494         @parser.parse(input).should == expected
495       end
496     end
497
498     # fewer specs here because the range of "mailto:" URIs recognized by the scanner is more limited
499     # (compared with, say, HTTP or HTTPS)
500     describe 'after "mailto:" URIs' do
501       it 'should terminate if followed by a period' do
502         input     = 'Try mailto:user@example.com.'
503         expected  = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a>.</p>\n}
504         @parser.parse(input).should == expected
505       end
506
507       it 'should not terminate on periods that occur within the URI' do
508         input     = 'Try mailto:user.name@example.com.'
509         expected  = %Q{<p>Try <a href="mailto:user.name@example.com" class="mailto">mailto:user.name@example.com</a>.</p>\n}
510         @parser.parse(input).should == expected
511       end
512
513       it 'should terminate if followed by a colon' do
514         input     = 'Try mailto:user@example.com:'
515         expected  = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a>:</p>\n}
516         @parser.parse(input).should == expected
517       end
518
519       it 'should terminate if followed by a comma' do
520         input     = 'Try mailto:user@example.com,'
521         expected  = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a>,</p>\n}
522         @parser.parse(input).should == expected
523       end
524
525       it 'should terminate if followed by an exclamation mark' do
526         input     = 'Try mailto:user@example.com!'
527         expected  = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a>!</p>\n}
528         @parser.parse(input).should == expected
529       end
530
531       it 'should terminate if followed by a question mark' do
532         input     = 'Try mailto:user@example.com?'
533         expected  = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a>?</p>\n}
534         @parser.parse(input).should == expected
535       end
536
537       it 'should not terminate on question marks that occur within the URI' do
538         pending
539         # this kind of autolink never worked (will require changes to the Ragel scanner)
540         input     = 'Try mailto:user@example.com?subject=foo?'
541         expected  = %Q{<p>Try <a href="mailto:user@example.com?subject=foo" class="external">mailto:user@example.com?subject=foo</a>.</p>\n}
542         @parser.parse(input).should == expected
543       end
544
545       it 'should terminate if followed by a semi-colon' do
546         input     = 'Try mailto:user@example.com;'
547         expected  = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a>;</p>\n}
548         @parser.parse(input).should == expected
549       end
550
551       it 'should terminate if followed by a right parenthesis' do
552         input     = '(Try mailto:user@example.com)'
553         expected  = %Q{<p>(Try <a href="mailto:user@example.com" class="mailto">mailto:user@example.com</a>)</p>\n}
554         @parser.parse(input).should == expected
555       end
556     end
557
558     describe 'after email addresses' do
559       it 'should terminate if followed by a period' do
560         input     = 'Try user@example.com.'
561         expected  = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">user@example.com</a>.</p>\n}
562         @parser.parse(input).should == expected
563       end
564
565       it 'should not terminate on periods that occur within the email address' do
566         input     = 'Try user.name@example.com.'
567         expected  = %Q{<p>Try <a href="mailto:user.name@example.com" class="mailto">user.name@example.com</a>.</p>\n}
568         @parser.parse(input).should == expected
569       end
570
571       it 'should terminate if followed by a colon' do
572         input     = 'Try user@example.com:'
573         expected  = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">user@example.com</a>:</p>\n}
574         @parser.parse(input).should == expected
575       end
576
577       it 'should terminate if followed by a comma' do
578         input     = 'Try user@example.com,'
579         expected  = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">user@example.com</a>,</p>\n}
580         @parser.parse(input).should == expected
581       end
582
583       it 'should terminate if followed by an exclamation mark' do
584         input     = 'Try user@example.com!'
585         expected  = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">user@example.com</a>!</p>\n}
586         @parser.parse(input).should == expected
587       end
588
589       it 'should terminate if followed by a question mark' do
590         input     = 'Try user@example.com?'
591         expected  = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">user@example.com</a>?</p>\n}
592         @parser.parse(input).should == expected
593       end
594
595       it 'should terminate if followed by a semi-colon' do
596         input     = 'Try user@example.com;'
597         expected  = %Q{<p>Try <a href="mailto:user@example.com" class="mailto">user@example.com</a>;</p>\n}
598         @parser.parse(input).should == expected
599       end
600
601       it 'should terminate if followed by a right parenthesis' do
602         input     = '(Try user@example.com)'
603         expected  = %Q{<p>(Try <a href="mailto:user@example.com" class="mailto">user@example.com</a>)</p>\n}
604         @parser.parse(input).should == expected
605       end
606     end
607
608     describe 'before HTTP URIs' do
609       it 'should handle left parenthesis before' do
610         input = "The site (http://example.com/)"
611         expected = %Q{<p>The site (<a href="http://example.com/" class="external">http://example.com/</a>)</p>\n}
612         @parser.parse(input).should == expected
613       end
614     end
615
616     describe 'before email addresses' do
617       it 'should handle left parenthesis before' do
618         input = "Email me (user@example.com)"
619         expected = %Q{<p>Email me (<a href="mailto:user@example.com" class="mailto">user@example.com</a>)</p>\n}
620         @parser.parse(input).should == expected
621       end
622     end
623   end
624 end