wikitext 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/spec/em_spec.rb ADDED
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/env ruby
2
+ # Copyright 2007-2008 Wincent Colaiuta
3
+ # This program is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ require File.join(File.dirname(__FILE__), 'spec_helper.rb')
17
+ require 'wikitext'
18
+
19
+ describe Wikitext::Parser, 'parsing <em> spans' do
20
+ before do
21
+ @parser = Wikitext::Parser.new
22
+ end
23
+
24
+ describe 'marked up using wikitext shorthand' do
25
+ it 'should recognize paired <em> tokens' do
26
+ @parser.parse("foo ''bar'' baz").should == "<p>foo <em>bar</em> baz</p>\n"
27
+ end
28
+
29
+ it 'should automatically insert missing closing tags' do
30
+ @parser.parse("foo ''bar").should == "<p>foo <em>bar</em></p>\n"
31
+ end
32
+
33
+ it 'should automatically close unclosed spans upon hitting newlines' do
34
+ @parser.parse("foo ''bar\nbaz").should == "<p>foo <em>bar</em> baz</p>\n"
35
+ end
36
+
37
+ it 'should handle (illegal) interleaved spans' do
38
+ @parser.parse("foo ''bar '''inner'' baz'''").should == "<p>foo <em>bar <strong>inner</strong></em> baz<strong></strong></p>\n"
39
+ end
40
+
41
+ it 'should have no effect inside <pre> blocks' do
42
+ @parser.parse(" ''foo''").should == "<pre>''foo''</pre>\n"
43
+ end
44
+
45
+ it 'should have no effect inside <nowiki> spans' do
46
+ @parser.parse("<nowiki>''foo''</nowiki>").should == "<p>''foo''</p>\n"
47
+ end
48
+
49
+ it "should have no effect if an em (<em>) span is already open" do
50
+ @parser.parse("foo <em>''bar''</em> baz").should == "<p>foo <em>''bar''</em> baz</p>\n"
51
+ end
52
+ end
53
+
54
+ describe 'marked up using HTML tags' do
55
+ it 'should recognized paired <em> tokens' do
56
+ @parser.parse("foo <em>bar</em> baz").should == "<p>foo <em>bar</em> baz</p>\n"
57
+ end
58
+
59
+ it 'should recognize <em> tokens case-insensitively' do
60
+ @parser.parse("foo <EM>bar</EM> baz").should == "<p>foo <em>bar</em> baz</p>\n"
61
+ @parser.parse("foo <Em>bar</eM> baz").should == "<p>foo <em>bar</em> baz</p>\n"
62
+ @parser.parse("foo <eM>bar</Em> baz").should == "<p>foo <em>bar</em> baz</p>\n"
63
+ end
64
+
65
+ it 'should automatically insert missing closing tags' do
66
+ @parser.parse("foo <em>bar").should == "<p>foo <em>bar</em></p>\n"
67
+ end
68
+
69
+ it 'should automatically close unclosed spans upon hitting newlines' do
70
+ @parser.parse("foo <em>bar\nbaz").should == "<p>foo <em>bar</em> baz</p>\n"
71
+ end
72
+
73
+ it 'should handle (illegal) interleaved spans' do
74
+ expected = "<p>foo <em>bar <strong>inner</strong></em> baz&lt;/strong&gt;</p>\n"
75
+ @parser.parse("foo <em>bar <strong>inner</em> baz</strong>").should == expected
76
+
77
+ expected = "<p>foo <em>bar <strong>inner</strong></em> baz<strong></strong></p>\n"
78
+ @parser.parse("foo <em>bar '''inner</em> baz'''").should == expected
79
+ end
80
+
81
+ it 'should handle (illegal) nested <em> spans' do
82
+ @parser.parse('foo <em>bar <em>inner</em></em> baz').should == "<p>foo <em>bar &lt;em&gt;inner</em>&lt;/em&gt; baz</p>\n"
83
+ end
84
+
85
+ it 'should have no effect inside <pre> blocks' do
86
+ @parser.parse(" <em>foo</em>").should == "<pre>&lt;em&gt;foo&lt;/em&gt;</pre>\n"
87
+ end
88
+
89
+ it 'should have no effect inside <nowiki> spans' do
90
+ @parser.parse("<nowiki><em>foo</em></nowiki>").should == "<p>&lt;em&gt;foo&lt;/em&gt;</p>\n"
91
+ end
92
+
93
+ it "should have no effect if an em ('') span is already open" do
94
+ @parser.parse("foo ''<em>bar</em>'' baz").should == "<p>foo <em>&lt;em&gt;bar&lt;/em&gt;</em> baz</p>\n"
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env ruby
2
+ # Copyright 2007-2008 Wincent Colaiuta
3
+ # This program is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ require File.join(File.dirname(__FILE__), 'spec_helper.rb')
17
+ require 'wikitext'
18
+ require 'iconv'
19
+
20
+ describe Wikitext, 'with invalidly encoded input' do
21
+ before do
22
+ @parser = Wikitext::Parser.new
23
+ end
24
+
25
+ it 'should raise an exception for missing second byte' do
26
+ lambda { @parser.parse(UTF8::Invalid::TWO_BYTES_MISSING_SECOND_BYTE) }.should raise_error(Wikitext::Parser::Error)
27
+ lambda {
28
+ @parser.parse('good text' + UTF8::Invalid::TWO_BYTES_MISSING_SECOND_BYTE)
29
+ }.should raise_error(Wikitext::Parser::Error)
30
+ end
31
+
32
+ it 'should raise an exception for malformed second byte' do
33
+ lambda { @parser.parse(UTF8::Invalid::TWO_BYTES_MALFORMED_SECOND_BYTE) }.should raise_error(Wikitext::Parser::Error)
34
+ lambda {
35
+ @parser.parse('good text' + UTF8::Invalid::TWO_BYTES_MALFORMED_SECOND_BYTE)
36
+ }.should raise_error(Wikitext::Parser::Error)
37
+ end
38
+
39
+ it 'should raise an exception for overlong sequence' do
40
+ lambda { @parser.parse(UTF8::Invalid::OVERLONG) }.should raise_error(Wikitext::Parser::Error)
41
+ lambda {
42
+ @parser.parse('good text' + UTF8::Invalid::OVERLONG)
43
+ }.should raise_error(Wikitext::Parser::Error)
44
+
45
+ # alternate
46
+ lambda { @parser.parse(UTF8::Invalid::OVERLONG_ALT) }.should raise_error(Wikitext::Parser::Error)
47
+ lambda {
48
+ @parser.parse('good text' + UTF8::Invalid::OVERLONG_ALT)
49
+ }.should raise_error(Wikitext::Parser::Error)
50
+ end
51
+
52
+ it 'should raise an exception for missing second byte in three-byte sequence' do
53
+ lambda { @parser.parse(UTF8::Invalid::THREE_BYTES_MISSING_SECOND_BYTE) }.should raise_error(Wikitext::Parser::Error)
54
+ lambda {
55
+ @parser.parse('good text' + UTF8::Invalid::THREE_BYTES_MISSING_SECOND_BYTE)
56
+ }.should raise_error(Wikitext::Parser::Error)
57
+ end
58
+
59
+ it 'should raise an exception for missing third byte in three-byte sequence' do
60
+ lambda { @parser.parse(UTF8::Invalid::THREE_BYTES_MISSING_THIRD_BYTE) }.should raise_error(Wikitext::Parser::Error)
61
+ lambda {
62
+ @parser.parse('good text' + UTF8::Invalid::THREE_BYTES_MISSING_THIRD_BYTE)
63
+ }.should raise_error(Wikitext::Parser::Error)
64
+ end
65
+
66
+ it 'should raise an exception for malformed second byte in three-byte sequence' do
67
+ lambda { @parser.parse(UTF8::Invalid::THREE_BYTES_MALFORMED_SECOND_BYTE) }.should raise_error(Wikitext::Parser::Error)
68
+ lambda {
69
+ @parser.parse('good text' + UTF8::Invalid::THREE_BYTES_MALFORMED_SECOND_BYTE)
70
+ }.should raise_error(Wikitext::Parser::Error)
71
+ end
72
+
73
+ it 'should raise an exception for malformed third byte in three-byte sequence' do
74
+ lambda { @parser.parse(UTF8::Invalid::THREE_BYTES_MALFORMED_THIRD_BYTE) }.should raise_error(Wikitext::Parser::Error)
75
+ lambda {
76
+ @parser.parse('good text' + UTF8::Invalid::THREE_BYTES_MALFORMED_THIRD_BYTE)
77
+ }.should raise_error(Wikitext::Parser::Error)
78
+ end
79
+
80
+ it 'should raise an exception for missing second byte in four-byte sequence' do
81
+ lambda { @parser.parse(UTF8::Invalid::FOUR_BYTES_MISSING_SECOND_BYTE) }.should raise_error(Wikitext::Parser::Error)
82
+ lambda {
83
+ @parser.parse('good text' + UTF8::Invalid::FOUR_BYTES_MISSING_SECOND_BYTE)
84
+ }.should raise_error(Wikitext::Parser::Error)
85
+ end
86
+
87
+ it 'should raise an exception for missing third byte in four-byte sequence' do
88
+ lambda { @parser.parse(UTF8::Invalid::FOUR_BYTES_MISSING_THIRD_BYTE) }.should raise_error(Wikitext::Parser::Error)
89
+ lambda {
90
+ @parser.parse('good text' + UTF8::Invalid::FOUR_BYTES_MISSING_THIRD_BYTE)
91
+ }.should raise_error(Wikitext::Parser::Error)
92
+ end
93
+
94
+ it 'should raise an exception for missing fourth byte in four-byte sequence' do
95
+ lambda { @parser.parse(UTF8::Invalid::FOUR_BYTES_MISSING_FOURTH_BYTE) }.should raise_error(Wikitext::Parser::Error)
96
+ lambda {
97
+ @parser.parse('good text' + UTF8::Invalid::FOUR_BYTES_MISSING_FOURTH_BYTE)
98
+ }.should raise_error(Wikitext::Parser::Error)
99
+ end
100
+
101
+ it 'should raise an exception for illegal first byte in four-byte sequence' do
102
+ lambda { @parser.parse(UTF8::Invalid::FOUR_BYTES_ILLEGAL_FIRST_BYTE) }.should raise_error(Wikitext::Parser::Error)
103
+ lambda {
104
+ @parser.parse('good text' + UTF8::Invalid::FOUR_BYTES_ILLEGAL_FIRST_BYTE)
105
+ }.should raise_error(Wikitext::Parser::Error)
106
+
107
+ lambda { @parser.parse(UTF8::Invalid::FOUR_BYTES_ILLEGAL_FIRST_BYTE_ALT) }.should raise_error(Wikitext::Parser::Error)
108
+ lambda {
109
+ @parser.parse('good text' + UTF8::Invalid::FOUR_BYTES_ILLEGAL_FIRST_BYTE_ALT)
110
+ }.should raise_error(Wikitext::Parser::Error)
111
+
112
+ lambda { @parser.parse(UTF8::Invalid::FOUR_BYTES_ILLEGAL_FIRST_BYTE_ALT2) }.should raise_error(Wikitext::Parser::Error)
113
+ lambda {
114
+ @parser.parse('good text' + UTF8::Invalid::FOUR_BYTES_ILLEGAL_FIRST_BYTE_ALT2)
115
+ }.should raise_error(Wikitext::Parser::Error)
116
+ end
117
+
118
+ it 'should raise an exception for unexpected bytes' do
119
+ lambda { @parser.parse(UTF8::Invalid::UNEXPECTED_BYTE) }.should raise_error(Wikitext::Parser::Error)
120
+ lambda {
121
+ @parser.parse('good text' + UTF8::Invalid::UNEXPECTED_BYTE)
122
+ }.should raise_error(Wikitext::Parser::Error)
123
+ end
124
+ end
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env ruby
2
+ # Copyright 2007-2008 Wincent Colaiuta
3
+ # This program is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ require File.join(File.dirname(__FILE__), 'spec_helper.rb')
17
+ require 'wikitext'
18
+
19
+ describe Wikitext::Parser, 'parsing entities' do
20
+ before do
21
+ @parser = Wikitext::Parser.new
22
+ end
23
+
24
+ it 'should pass numeric (decimal) entities through unchanged' do
25
+ @parser.parse('&#8364;').should == "<p>&#8364;</p>\n"
26
+ end
27
+
28
+ it 'should normalize case variations in hexadecimal entities' do
29
+ @parser.parse('&#x20ac;').should == "<p>&#x20ac;</p>\n"
30
+ @parser.parse('&#x20AC;').should == "<p>&#x20ac;</p>\n"
31
+ @parser.parse('&#X20ac;').should == "<p>&#x20ac;</p>\n"
32
+ @parser.parse('&#X20AC;').should == "<p>&#x20ac;</p>\n"
33
+ end
34
+
35
+ it 'should pass named entities through unchanged' do
36
+ @parser.parse('&Aacute;').should == "<p>&Aacute;</p>\n" # these are two different entities
37
+ @parser.parse('&aacute;').should == "<p>&aacute;</p>\n" # ie. they are case sensitive
38
+ @parser.parse('&euro;').should == "<p>&euro;</p>\n"
39
+ end
40
+ end
@@ -0,0 +1,289 @@
1
+ #!/usr/bin/env ruby
2
+ # Copyright 2007-2008 Wincent Colaiuta
3
+ # This program is free software: you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation, either version 3 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
15
+
16
+ require File.join(File.dirname(__FILE__), 'spec_helper.rb')
17
+ require 'wikitext'
18
+
19
+ describe Wikitext::Parser, 'external links' do
20
+ before do
21
+ @parser = Wikitext::Parser.new
22
+ end
23
+
24
+ it 'should format valid external HTTP links' do
25
+ expected = %Q{<p><a href="http://google.com/" class="external">Google</a></p>\n}
26
+ @parser.parse('[http://google.com/ Google]').should == expected
27
+ end
28
+
29
+ it 'should format valid external HTTPS links' do
30
+ expected = %Q{<p><a href="https://google.com/" class="external">Google</a></p>\n}
31
+ @parser.parse('[https://google.com/ Google]').should == expected
32
+ end
33
+
34
+ it 'should format valid external FTP links' do
35
+ expected = %Q{<p><a href="ftp://google.com/" class="external">Google</a></p>\n}
36
+ @parser.parse('[ftp://google.com/ Google]').should == expected
37
+ end
38
+
39
+ it 'should format valid external SVN links' do
40
+ expected = %Q{<p><a href="svn://google.com/" class="external">Google</a></p>\n}
41
+ @parser.parse('[svn://google.com/ Google]').should == expected
42
+ end
43
+
44
+ it 'should format valid external mailto links' do
45
+ # although note in this case the CSS class is "external" rather than "mailto"
46
+ # this is because we're matching this as a (generic) URI rather than an email address
47
+ expected = %Q{<p><a href="mailto:user@example.com" class="external">john</a></p>\n}
48
+ @parser.parse('[mailto:user@example.com john]').should == expected
49
+ end
50
+
51
+ it 'should treat runs of spaces after the link target as a single space' do
52
+ expected = %Q{<p><a href="http://google.com/" class="external">Google</a></p>\n}
53
+ @parser.parse('[http://google.com/ Google]').should == expected
54
+ end
55
+
56
+ it 'should not treat runs of spaces within the link text as a single space' do
57
+ expected = %Q{<p><a href="http://google.com/" class="external">Google search</a></p>\n}
58
+ @parser.parse('[http://google.com/ Google search]').should == expected
59
+ end
60
+
61
+ it 'should format a link with emphasis in the link text' do
62
+ expected = %Q{<p><a href="http://google.com/" class="external">Google <em>rocks</em></a></p>\n}
63
+ @parser.parse("[http://google.com/ Google ''rocks'']").should == expected
64
+ end
65
+
66
+ it "should automatically close unmatched '' tags in the link text" do
67
+ expected = %Q{<p><a href="http://google.com/" class="external">Google <em>SOC</em></a></p>\n}
68
+ @parser.parse("[http://google.com/ Google ''SOC]").should == expected
69
+ end
70
+
71
+ it 'should format a link with strong formatting in the link text' do
72
+ expected = %Q{<p><a href="http://google.com/" class="external"><strong>Google</strong> rocks</a></p>\n}
73
+ @parser.parse("[http://google.com/ '''Google''' rocks]").should == expected
74
+ end
75
+
76
+ it "should automatically close unmatched ''' tags in the link text" do
77
+ expected = %Q{<p><a href="http://google.com/" class="external">Google <strong>SOC</strong></a></p>\n}
78
+ @parser.parse("[http://google.com/ Google '''SOC]").should == expected
79
+ end
80
+
81
+ it 'should format a link with <tt></tt> tags in the link text' do
82
+ expected = %Q{<p><a href="http://google.com/" class="external">Google <tt>SOC</tt></a></p>\n}
83
+ @parser.parse("[http://google.com/ Google <tt>SOC</tt>]").should == expected
84
+ end
85
+
86
+ it 'should automatically close unmatched <tt> tags in the link text' do
87
+ expected = %Q{<p><a href="http://google.com/" class="external">Google <tt>SOC</tt></a></p>\n}
88
+ @parser.parse("[http://google.com/ Google <tt>SOC]").should == expected
89
+ end
90
+
91
+ it 'should format a link with strong and emphasis in the link text' do
92
+ expected = %Q{<p><a href="http://google.com/" class="external">Google <strong><em>rocks</em></strong></a></p>\n}
93
+ @parser.parse("[http://google.com/ Google '''''rocks''''']").should == expected
94
+ end
95
+
96
+ it "should automatically close unmatched ''''' tags in the link text" do
97
+ expected = %Q{<p><a href="http://google.com/" class="external">Google <strong><em>SOC</em></strong></a></p>\n}
98
+ @parser.parse("[http://google.com/ Google '''''SOC]").should == expected
99
+ end
100
+
101
+ it 'should respect "<nowiki></nowiki>" tags inside the link text' do
102
+ expected = %Q{<p><a href="http://google.com/" class="external">Google ] rocks</a></p>\n}
103
+ @parser.parse("[http://google.com/ Google <nowiki>]</nowiki> rocks]").should == expected # was a bug
104
+
105
+ expected = %Q{<p><a href="http://google.com/" class="external">Google [ rocks</a></p>\n}
106
+ @parser.parse("[http://google.com/ Google <nowiki>[</nowiki> rocks]").should == expected # was a bug
107
+ end
108
+
109
+ it 'should pass "[" in link text through literally' do
110
+ expected = %Q{<p><a href="http://google.com/" class="external">Google [ rocks</a></p>\n}
111
+ @parser.parse("[http://google.com/ Google [ rocks]").should == expected # was a bug
112
+ end
113
+
114
+ it 'should pass "[[" in link text through literally' do
115
+ expected = %Q{<p><a href="http://google.com/" class="external">Google [[ rocks</a></p>\n}
116
+ @parser.parse("[http://google.com/ Google [[ rocks]").should == expected # was a bug
117
+ end
118
+
119
+ it 'should pass "]]" in link text through literally' do
120
+ # note how "]]" is treated as a single token, not as a "]" which closes the link followed by another ("] rocks]")
121
+ expected = %Q{<p><a href="http://google.com/" class="external">Google ]] rocks</a></p>\n}
122
+ @parser.parse("[http://google.com/ Google ]] rocks]").should == expected # was a bug
123
+ end
124
+
125
+ it 'should pass through ASCII entities in the link text' do
126
+ expected = %Q{<p><a href="http://google.com/" class="external">Google &quot;SOC&quot;</a></p>\n} # QUOT
127
+ @parser.parse(%Q{[http://google.com/ Google "SOC"]}).should == expected
128
+ expected = %Q{<p><a href="http://google.com/" class="external">Google &lt;SOC&gt;</a></p>\n} # LESS, GREATER
129
+ @parser.parse(%Q{[http://google.com/ Google <SOC>]}).should == expected
130
+ expected = %Q{<p><a href="http://google.com/" class="external">Google &amp; SOC</a></p>\n} # AMP
131
+ @parser.parse(%Q{[http://google.com/ Google & SOC]}).should == expected
132
+ end
133
+
134
+ it 'should pass through named entities in the link text' do
135
+ expected = %Q{<p><a href="http://google.com/" class="external">Google &euro;</a></p>\n}
136
+ @parser.parse(%Q{[http://google.com/ Google &euro;]}).should == expected
137
+ end
138
+
139
+ it 'should pass through decimal entities in the link text' do
140
+ expected = %Q{<p><a href="http://google.com/" class="external">Google &#8364;</a></p>\n}
141
+ @parser.parse(%Q{[http://google.com/ Google &#8364;]}).should == expected
142
+ end
143
+
144
+ it 'should pass through hexadecimal entities in the link text' do
145
+ expected = %Q{<p><a href="http://google.com/" class="external">Google &#x20ac;</a></p>\n}
146
+ @parser.parse(%Q{[http://google.com/ Google &#x20ac;]}).should == expected
147
+ end
148
+
149
+ it 'should convert non-ASCII characters in the link text into entities' do
150
+ expected = %Q{<p><a href="http://google.com/" class="external">Google &#x20ac;</a></p>\n}
151
+ @parser.parse(%Q{[http://google.com/ Google €]}).should == expected
152
+ end
153
+
154
+ it 'should pass through unexpected external link end tokens literally' do
155
+ @parser.parse('foo ] bar').should == "<p>foo ] bar</p>\n" # in plain scope
156
+ @parser.parse("foo '']'' bar").should == "<p>foo <em>]</em> bar</p>\n" # in EM scope
157
+ @parser.parse("foo ''']''' bar").should == "<p>foo <strong>]</strong> bar</p>\n" # in STRONG scope
158
+ @parser.parse("foo ''''']''''' bar").should == "<p>foo <strong><em>]</em></strong> bar</p>\n" # in STRONG_EM scope
159
+ @parser.parse('foo <tt>]</tt> bar').should == "<p>foo <tt>]</tt> bar</p>\n" # in TT scope
160
+ @parser.parse('= foo ] bar =').should == "<h1>foo ] bar</h1>\n" # in H1 scope
161
+ @parser.parse('== foo ] bar ==').should == "<h2>foo ] bar</h2>\n" # in H2 scope
162
+ @parser.parse('=== foo ] bar ===').should == "<h3>foo ] bar</h3>\n" # in H3 scope
163
+ @parser.parse('==== foo ] bar ====').should == "<h4>foo ] bar</h4>\n" # in H4 scope
164
+ @parser.parse('===== foo ] bar =====').should == "<h5>foo ] bar</h5>\n" # in H5 scope
165
+ @parser.parse('====== foo ] bar ======').should == "<h6>foo ] bar</h6>\n" # in H6 scope
166
+ @parser.parse('> ]').should == "<blockquote>\n <p>]</p>\n</blockquote>\n" # in BLOCKQUOTE scope
167
+ end
168
+
169
+ describe 'questionable links' do
170
+ it 'should handle links which contain an embedded [ character' do
171
+ # note that [ is allowed in the link text, although the result may be unexpected to the user
172
+ expected = %Q{<p><a href="http://google.com/" class="external">[hello</a></p>\n}
173
+ @parser.parse("[http://google.com/ [hello]").should == expected
174
+ end
175
+
176
+ it 'should handle links which contain an embedded ] character' do
177
+ # note how the first ] terminates the link
178
+ expected = %Q{<p><a href="http://google.com/" class="external">[hello</a> world]</p>\n}
179
+ @parser.parse("[http://google.com/ [hello] world]").should == expected
180
+ end
181
+
182
+ it 'should handle links which contain an embedded [[ character' do
183
+ # note that [[ is allowed in the link text
184
+ expected = %Q{<p><a href="http://google.com/" class="external">[[hello</a></p>\n}
185
+ @parser.parse("[http://google.com/ [[hello]").should == expected
186
+ end
187
+
188
+ it 'should handle links which contain an embedded ]] character' do
189
+ # note how this time ]] does not terminate the link because it is tokenized as LINK_END rather than EXT_LINK_END
190
+ expected = %Q{<p><a href="http://google.com/" class="external">[[hello]] world</a></p>\n}
191
+ @parser.parse("[http://google.com/ [[hello]] world]").should == expected
192
+ end
193
+
194
+ it 'should allow URIs in the link text' do
195
+ # not sure why you'd want to do this, but...
196
+ expected = %Q{<p><a href="http://example.net/" class="external">hello http://example.com/ world</a></p>\n}
197
+ @parser.parse('[http://example.net/ hello http://example.com/ world]').should == expected
198
+ end
199
+ end
200
+
201
+ describe 'invalid links' do
202
+ it "should pass through links which don't have a valid target" do
203
+ expected = "<p>[well]</p>\n"
204
+ @parser.parse("[well]").should == expected
205
+ end
206
+
207
+ it "should pass through links which don't have any target" do
208
+ expected = "<p>[]</p>\n"
209
+ @parser.parse('[]').should == expected
210
+ end
211
+
212
+ it 'should pass through unterminated links (EOF)' do
213
+ expected = "<p>[</p>\n"
214
+ @parser.parse('[').should == expected
215
+
216
+ expected = "<p>[well</p>\n"
217
+ @parser.parse("[well").should == expected
218
+
219
+ expected = %Q{<p>[<a href="http://example.com/" class="external">http://example.com/</a></p>\n}
220
+ @parser.parse("[http://example.com/").should == expected
221
+
222
+ expected = %Q{<p>[<a href="http://example.com/" class="external">http://example.com/</a> </p>\n}
223
+ @parser.parse("[http://example.com/ ").should == expected
224
+
225
+ expected = %Q{<p>[<a href="http://example.com/" class="external">http://example.com/</a> visit</p>\n}
226
+ @parser.parse("[http://example.com/ visit").should == expected # was a bug
227
+
228
+ expected = %Q{<h6>[<a href="http://example.com/" class="external">http://example.com/</a> visit</h6>\n}
229
+ @parser.parse("====== [http://example.com/ visit").should == expected # was a bug
230
+
231
+ expected = %Q{<h5>[<a href="http://example.com/" class="external">http://example.com/</a> visit</h5>\n}
232
+ @parser.parse("===== [http://example.com/ visit").should == expected # was a bug
233
+
234
+ expected = %Q{<h4>[<a href="http://example.com/" class="external">http://example.com/</a> visit</h4>\n}
235
+ @parser.parse("==== [http://example.com/ visit").should == expected # was a bug
236
+
237
+ expected = %Q{<h3>[<a href="http://example.com/" class="external">http://example.com/</a> visit</h3>\n}
238
+ @parser.parse("=== [http://example.com/ visit").should == expected # was a bug
239
+
240
+ expected = %Q{<h2>[<a href="http://example.com/" class="external">http://example.com/</a> visit</h2>\n}
241
+ @parser.parse("== [http://example.com/ visit").should == expected # was a bug
242
+
243
+ expected = %Q{<h1>[<a href="http://example.com/" class="external">http://example.com/</a> visit</h1>\n}
244
+ @parser.parse("= [http://example.com/ visit").should == expected # was a bug
245
+
246
+ expected = %Q{<p>[<a href="http://example.com/" class="external">http://example.com/</a> ...</p>\n}
247
+ @parser.parse("[http://example.com/ <nowiki>...\n").should == expected
248
+ end
249
+
250
+ it 'should pass through unterminated links (end-of-line)' do
251
+ expected = "<p>[</p>\n"
252
+ @parser.parse("[\n").should == expected
253
+
254
+ expected = "<p>[well</p>\n"
255
+ @parser.parse("[well\n").should == expected
256
+
257
+ expected = %Q{<p>[<a href="http://example.com/" class="external">http://example.com/</a></p>\n}
258
+ @parser.parse("[http://example.com/\n").should == expected
259
+
260
+ expected = %Q{<p>[<a href="http://example.com/" class="external">http://example.com/</a> </p>\n}
261
+ @parser.parse("[http://example.com/ \n").should == expected
262
+
263
+ expected = %Q{<p>[<a href="http://example.com/" class="external">http://example.com/</a> visit</p>\n}
264
+ @parser.parse("[http://example.com/ visit\n").should == expected # was a bug
265
+
266
+ expected = %Q{<h6>[<a href="http://example.com/" class="external">http://example.com/</a> visit</h6>\n}
267
+ @parser.parse("====== [http://example.com/ visit\n").should == expected # was a bug
268
+
269
+ expected = %Q{<h5>[<a href="http://example.com/" class="external">http://example.com/</a> visit</h5>\n}
270
+ @parser.parse("===== [http://example.com/ visit\n").should == expected # was a bug
271
+
272
+ expected = %Q{<h4>[<a href="http://example.com/" class="external">http://example.com/</a> visit</h4>\n}
273
+ @parser.parse("==== [http://example.com/ visit\n").should == expected # was a bug
274
+
275
+ expected = %Q{<h3>[<a href="http://example.com/" class="external">http://example.com/</a> visit</h3>\n}
276
+ @parser.parse("=== [http://example.com/ visit\n").should == expected # was a bug
277
+
278
+ expected = %Q{<h2>[<a href="http://example.com/" class="external">http://example.com/</a> visit</h2>\n}
279
+ @parser.parse("== [http://example.com/ visit\n").should == expected # was a bug
280
+
281
+ expected = %Q{<h1>[<a href="http://example.com/" class="external">http://example.com/</a> visit</h1>\n}
282
+ @parser.parse("= [http://example.com/ visit\n").should == expected # was a bug
283
+
284
+ # here's a slightly more complicated example using a blockquote
285
+ expected = %Q{<blockquote>\n <p>[<a href="http://google.com/" class="external">http://google.com/</a></p>\n</blockquote>\n}
286
+ @parser.parse("> [http://google.com/\n").should == expected # was a bug
287
+ end
288
+ end
289
+ end