wikitext 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/ary.h +99 -0
- data/ext/depend +22 -0
- data/ext/extconf.rb +23 -0
- data/ext/parser.c +2174 -0
- data/ext/parser.h +31 -0
- data/ext/str.h +135 -0
- data/ext/token.c +109 -0
- data/ext/token.h +95 -0
- data/ext/wikitext.c +60 -0
- data/ext/wikitext.h +30 -0
- data/ext/wikitext_ragel.c +3354 -0
- data/ext/wikitext_ragel.h +17 -0
- data/spec/autolinking_spec.rb +122 -0
- data/spec/blockquote_spec.rb +570 -0
- data/spec/em_spec.rb +97 -0
- data/spec/encoding_spec.rb +124 -0
- data/spec/entity_spec.rb +40 -0
- data/spec/external_link_spec.rb +289 -0
- data/spec/h1_spec.rb +59 -0
- data/spec/h2_spec.rb +59 -0
- data/spec/h3_spec.rb +59 -0
- data/spec/h4_spec.rb +59 -0
- data/spec/h5_spec.rb +59 -0
- data/spec/h6_spec.rb +59 -0
- data/spec/indentation_spec.rb +70 -0
- data/spec/integration_spec.rb +265 -0
- data/spec/internal_link_spec.rb +445 -0
- data/spec/line_endings_spec.rb +81 -0
- data/spec/link_encoding_spec.rb +132 -0
- data/spec/link_sanitizing_spec.rb +228 -0
- data/spec/nowiki_spec.rb +155 -0
- data/spec/p_spec.rb +44 -0
- data/spec/pre_spec.rb +411 -0
- data/spec/regressions_spec.rb +45 -0
- data/spec/spec_helper.rb +77 -0
- data/spec/strong_em_spec.rb +89 -0
- data/spec/strong_spec.rb +99 -0
- data/spec/tokenizing_spec.rb +190 -0
- data/spec/tt_spec.rb +100 -0
- data/spec/ul_spec.rb +307 -0
- data/spec/wikitext_spec.rb +50 -0
- metadata +93 -0
@@ -0,0 +1,132 @@
|
|
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 'uri'
|
19
|
+
|
20
|
+
describe Wikitext, 'encoding a link target' do
|
21
|
+
it 'should complain if passed nil' do
|
22
|
+
lambda { Wikitext::Parser.encode_link_target(nil) }.should raise_error
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should do nothing on zero-length input' do
|
26
|
+
Wikitext::Parser.encode_link_target('').should == ''
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should convert embedded spaces into "%20"' do
|
30
|
+
Wikitext::Parser.encode_link_target('hello world').should == 'hello%20world'
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should eat leading spaces' do
|
34
|
+
Wikitext::Parser.encode_link_target(' hello world').should == 'hello%20world'
|
35
|
+
Wikitext::Parser.encode_link_target(' hello world').should == 'hello%20world'
|
36
|
+
Wikitext::Parser.encode_link_target(' hello world').should == 'hello%20world'
|
37
|
+
Wikitext::Parser.encode_link_target(' hello world').should == 'hello%20world'
|
38
|
+
Wikitext::Parser.encode_link_target(' hello world').should == 'hello%20world'
|
39
|
+
Wikitext::Parser.encode_link_target(' hello world').should == 'hello%20world'
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should eat trailing spaces' do
|
43
|
+
Wikitext::Parser.encode_link_target('hello world ').should == 'hello%20world'
|
44
|
+
Wikitext::Parser.encode_link_target('hello world ').should == 'hello%20world'
|
45
|
+
Wikitext::Parser.encode_link_target('hello world ').should == 'hello%20world'
|
46
|
+
Wikitext::Parser.encode_link_target('hello world ').should == 'hello%20world'
|
47
|
+
Wikitext::Parser.encode_link_target('hello world ').should == 'hello%20world'
|
48
|
+
Wikitext::Parser.encode_link_target('hello world ').should == 'hello%20world'
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should eat leading and trailing spaces combined' do
|
52
|
+
Wikitext::Parser.encode_link_target(' hello world ').should == 'hello%20world'
|
53
|
+
Wikitext::Parser.encode_link_target(' hello world ').should == 'hello%20world'
|
54
|
+
Wikitext::Parser.encode_link_target(' hello world ').should == 'hello%20world'
|
55
|
+
Wikitext::Parser.encode_link_target(' hello world ').should == 'hello%20world'
|
56
|
+
Wikitext::Parser.encode_link_target(' hello world ').should == 'hello%20world'
|
57
|
+
Wikitext::Parser.encode_link_target(' hello world ').should == 'hello%20world'
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should return nothing for input consisting entirely of spaces' do
|
61
|
+
Wikitext::Parser.encode_link_target(' ').should == ''
|
62
|
+
Wikitext::Parser.encode_link_target(' ').should == ''
|
63
|
+
Wikitext::Parser.encode_link_target(' ').should == ''
|
64
|
+
Wikitext::Parser.encode_link_target(' ').should == ''
|
65
|
+
Wikitext::Parser.encode_link_target(' ').should == ''
|
66
|
+
Wikitext::Parser.encode_link_target(' ').should == ''
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should convert reserved symbols into percent escapes' do
|
70
|
+
Wikitext::Parser.encode_link_target('http://www.apple.com/q?foo').should == 'http%3a%2f%2fwww.apple.com%2fq%3ffoo'
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should convert non-ASCII into UTF-8 and then apply percent escapes' do
|
74
|
+
Wikitext::Parser.encode_link_target('cañon').should == 'ca%c3%b1on'
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should handle mixed scenarios (commas, double-quotes and UTF-8)' do
|
78
|
+
Wikitext::Parser.encode_link_target('foo, "bar" & baz €').should == 'foo%2c%20%22bar%22%20%26%20baz%20%e2%82%ac'
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'should get the same answer as URI.escape' do
|
82
|
+
reserved = Regexp.new("[^#{URI::PATTERN::UNRESERVED}]")
|
83
|
+
['foo bar', 'http://www.google.com/search?q=hello&foo=bar', '€'].each do |string|
|
84
|
+
Wikitext::Parser.encode_link_target(string).should == URI.escape(string, reserved).downcase
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# "special" links don't get transformed in any way
|
89
|
+
describe 'special links' do
|
90
|
+
it 'should recognize links which match /\A[a-z]+\/\d+\z/ as being special' do
|
91
|
+
string = 'foo/10'
|
92
|
+
Wikitext::Parser.encode_special_link_target(string).should == string
|
93
|
+
Wikitext::Parser.encode_link_target(string).should_not == string
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should not recognize links which don't match at /\A/ as being special" do
|
97
|
+
string = ' foo/10'
|
98
|
+
Wikitext::Parser.encode_special_link_target(string).should_not == string
|
99
|
+
string = '..foo/10'
|
100
|
+
Wikitext::Parser.encode_special_link_target(string).should_not == string
|
101
|
+
string = '12foo/10'
|
102
|
+
Wikitext::Parser.encode_special_link_target(string).should_not == string
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should not recognize links which don't match at /\z/ as being special" do
|
106
|
+
string = 'foo/10 '
|
107
|
+
Wikitext::Parser.encode_special_link_target(string).should_not == string
|
108
|
+
string = 'foo/10__'
|
109
|
+
Wikitext::Parser.encode_special_link_target(string).should_not == string
|
110
|
+
string = 'foo/10##'
|
111
|
+
Wikitext::Parser.encode_special_link_target(string).should_not == string
|
112
|
+
string = 'foo/10ab'
|
113
|
+
Wikitext::Parser.encode_special_link_target(string).should_not == string
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should not recognize links which don't match at /[a-z]/ (case differences) as being special" do
|
117
|
+
string = 'FOO/10'
|
118
|
+
Wikitext::Parser.encode_special_link_target(string).should_not == string
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should not recognize links which don't match at /[0-9]/ (case differences) as being special" do
|
122
|
+
string = 'foo/xx'
|
123
|
+
Wikitext::Parser.encode_special_link_target(string).should_not == string
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should not recognize links which don't match at /\// as being special" do
|
127
|
+
string = 'foo 10'
|
128
|
+
Wikitext::Parser.encode_special_link_target(string).should_not == string
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
@@ -0,0 +1,228 @@
|
|
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, 'sanitizing a link target' do
|
20
|
+
it 'should complain if passed nil' do
|
21
|
+
lambda { Wikitext::Parser.sanitize_link_target(nil) }.should raise_error
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should complain if passed <' do
|
25
|
+
lambda { Wikitext::Parser.sanitize_link_target('<') }.should raise_error(RangeError, /</)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should complain if passed >' do
|
29
|
+
lambda { Wikitext::Parser.sanitize_link_target('>') }.should raise_error(RangeError, />/)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should do nothing on zero-length input' do
|
33
|
+
Wikitext::Parser.sanitize_link_target('').should == ''
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should do nothing to embedded spaces' do
|
37
|
+
Wikitext::Parser.sanitize_link_target('hello world').should == 'hello world'
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should eat leading spaces' do
|
41
|
+
Wikitext::Parser.sanitize_link_target(' hello world').should == 'hello world'
|
42
|
+
Wikitext::Parser.sanitize_link_target(' hello world').should == 'hello world'
|
43
|
+
Wikitext::Parser.sanitize_link_target(' hello world').should == 'hello world'
|
44
|
+
Wikitext::Parser.sanitize_link_target(' hello world').should == 'hello world'
|
45
|
+
Wikitext::Parser.sanitize_link_target(' hello world').should == 'hello world'
|
46
|
+
Wikitext::Parser.sanitize_link_target(' hello world').should == 'hello world'
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should eat trailing spaces' do
|
50
|
+
Wikitext::Parser.sanitize_link_target('hello world ').should == 'hello world'
|
51
|
+
Wikitext::Parser.sanitize_link_target('hello world ').should == 'hello world'
|
52
|
+
Wikitext::Parser.sanitize_link_target('hello world ').should == 'hello world'
|
53
|
+
Wikitext::Parser.sanitize_link_target('hello world ').should == 'hello world'
|
54
|
+
Wikitext::Parser.sanitize_link_target('hello world ').should == 'hello world' # was a crasher
|
55
|
+
Wikitext::Parser.sanitize_link_target('hello world ').should == 'hello world' # was a crasher
|
56
|
+
|
57
|
+
# same but with lots of entities to force a reallocation (we were crashing under reallocation)
|
58
|
+
expected = '""""""""""'
|
59
|
+
Wikitext::Parser.sanitize_link_target('"""""""""" ').should == expected
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should eat leading and trailing spaces combined' do
|
63
|
+
Wikitext::Parser.sanitize_link_target(' hello world ').should == 'hello world'
|
64
|
+
Wikitext::Parser.sanitize_link_target(' hello world ').should == 'hello world'
|
65
|
+
Wikitext::Parser.sanitize_link_target(' hello world ').should == 'hello world'
|
66
|
+
Wikitext::Parser.sanitize_link_target(' hello world ').should == 'hello world'
|
67
|
+
Wikitext::Parser.sanitize_link_target(' hello world ').should == 'hello world'
|
68
|
+
Wikitext::Parser.sanitize_link_target(' hello world ').should == 'hello world'
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should return nothing for input consisting entirely of spaces' do
|
72
|
+
Wikitext::Parser.sanitize_link_target(' ').should == ''
|
73
|
+
Wikitext::Parser.sanitize_link_target(' ').should == ''
|
74
|
+
Wikitext::Parser.sanitize_link_target(' ').should == ''
|
75
|
+
Wikitext::Parser.sanitize_link_target(' ').should == ''
|
76
|
+
Wikitext::Parser.sanitize_link_target(' ').should == ''
|
77
|
+
Wikitext::Parser.sanitize_link_target(' ').should == ''
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'should convert double quotes into named entities' do
|
81
|
+
Wikitext::Parser.sanitize_link_target('hello "world"').should == 'hello "world"'
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'should convert ampersands into named entities' do
|
85
|
+
Wikitext::Parser.sanitize_link_target('hello & goodbye').should == 'hello & goodbye'
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'should convert non-ASCII hexadecimal entities' do
|
89
|
+
Wikitext::Parser.sanitize_link_target('cañon').should == 'cañon'
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'should handle mixed scenarios (ampersands, double-quotes and non-ASCII)' do
|
93
|
+
Wikitext::Parser.sanitize_link_target('foo, "bar" & baz €').should == 'foo, "bar" & baz €'
|
94
|
+
end
|
95
|
+
|
96
|
+
# here we're exercising the _Wikitext_utf8_to_utf32 function
|
97
|
+
describe 'with invalidly encoded input' do
|
98
|
+
it 'should raise an exception for missing second byte' do
|
99
|
+
lambda {
|
100
|
+
Wikitext::Parser.sanitize_link_target(UTF8::Invalid::TWO_BYTES_MISSING_SECOND_BYTE)
|
101
|
+
}.should raise_error(Wikitext::Parser::Error, /truncated/)
|
102
|
+
lambda {
|
103
|
+
Wikitext::Parser.sanitize_link_target('good text' + UTF8::Invalid::TWO_BYTES_MISSING_SECOND_BYTE)
|
104
|
+
}.should raise_error(Wikitext::Parser::Error, /truncated/)
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'should raise an exception for malformed second byte' do
|
108
|
+
lambda {
|
109
|
+
Wikitext::Parser.sanitize_link_target(UTF8::Invalid::TWO_BYTES_MALFORMED_SECOND_BYTE)
|
110
|
+
}.should raise_error(Wikitext::Parser::Error, /malformed/)
|
111
|
+
lambda {
|
112
|
+
Wikitext::Parser.sanitize_link_target('good text' + UTF8::Invalid::TWO_BYTES_MALFORMED_SECOND_BYTE)
|
113
|
+
}.should raise_error(Wikitext::Parser::Error, /malformed/)
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'should raise an exception for overlong sequence' do
|
117
|
+
lambda {
|
118
|
+
Wikitext::Parser.sanitize_link_target(UTF8::Invalid::OVERLONG)
|
119
|
+
}.should raise_error(Wikitext::Parser::Error, /overlong/)
|
120
|
+
lambda {
|
121
|
+
Wikitext::Parser.sanitize_link_target('good text' + UTF8::Invalid::OVERLONG)
|
122
|
+
}.should raise_error(Wikitext::Parser::Error, /overlong/)
|
123
|
+
|
124
|
+
# alternate
|
125
|
+
lambda {
|
126
|
+
Wikitext::Parser.sanitize_link_target(UTF8::Invalid::OVERLONG_ALT)
|
127
|
+
}.should raise_error(Wikitext::Parser::Error, /overlong/)
|
128
|
+
lambda {
|
129
|
+
Wikitext::Parser.sanitize_link_target('good text' + UTF8::Invalid::OVERLONG_ALT)
|
130
|
+
}.should raise_error(Wikitext::Parser::Error, /overlong/)
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'should raise an exception for missing second byte in three-byte sequence' do
|
134
|
+
lambda {
|
135
|
+
Wikitext::Parser.sanitize_link_target(UTF8::Invalid::THREE_BYTES_MISSING_SECOND_BYTE)
|
136
|
+
}.should raise_error(Wikitext::Parser::Error, /truncated/)
|
137
|
+
lambda {
|
138
|
+
Wikitext::Parser.sanitize_link_target('good text' + UTF8::Invalid::THREE_BYTES_MISSING_SECOND_BYTE)
|
139
|
+
}.should raise_error(Wikitext::Parser::Error, /truncated/)
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'should raise an exception for missing third byte in three-byte sequence' do
|
143
|
+
lambda {
|
144
|
+
Wikitext::Parser.sanitize_link_target(UTF8::Invalid::THREE_BYTES_MISSING_THIRD_BYTE)
|
145
|
+
}.should raise_error(Wikitext::Parser::Error, /truncated/)
|
146
|
+
lambda {
|
147
|
+
Wikitext::Parser.sanitize_link_target('good text' + UTF8::Invalid::THREE_BYTES_MISSING_THIRD_BYTE)
|
148
|
+
}.should raise_error(Wikitext::Parser::Error, /truncated/)
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'should raise an exception for malformed second byte in three-byte sequence' do
|
152
|
+
lambda {
|
153
|
+
Wikitext::Parser.sanitize_link_target(UTF8::Invalid::THREE_BYTES_MALFORMED_SECOND_BYTE)
|
154
|
+
}.should raise_error(Wikitext::Parser::Error, /malformed/)
|
155
|
+
lambda {
|
156
|
+
Wikitext::Parser.sanitize_link_target('good text' + UTF8::Invalid::THREE_BYTES_MALFORMED_SECOND_BYTE)
|
157
|
+
}.should raise_error(Wikitext::Parser::Error, /malformed/)
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'should raise an exception for malformed third byte in three-byte sequence' do
|
161
|
+
lambda {
|
162
|
+
Wikitext::Parser.sanitize_link_target(UTF8::Invalid::THREE_BYTES_MALFORMED_THIRD_BYTE)
|
163
|
+
}.should raise_error(Wikitext::Parser::Error, /malformed/)
|
164
|
+
lambda {
|
165
|
+
Wikitext::Parser.sanitize_link_target('good text' + UTF8::Invalid::THREE_BYTES_MALFORMED_THIRD_BYTE)
|
166
|
+
}.should raise_error(Wikitext::Parser::Error, /malformed/)
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'should raise an exception for missing second byte in four-byte sequence' do
|
170
|
+
lambda {
|
171
|
+
Wikitext::Parser.sanitize_link_target(UTF8::Invalid::FOUR_BYTES_MISSING_SECOND_BYTE)
|
172
|
+
}.should raise_error(Wikitext::Parser::Error, /truncated/)
|
173
|
+
lambda {
|
174
|
+
Wikitext::Parser.sanitize_link_target('good text' + UTF8::Invalid::FOUR_BYTES_MISSING_SECOND_BYTE)
|
175
|
+
}.should raise_error(Wikitext::Parser::Error, /truncated/)
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'should raise an exception for missing third byte in four-byte sequence' do
|
179
|
+
lambda {
|
180
|
+
Wikitext::Parser.sanitize_link_target(UTF8::Invalid::FOUR_BYTES_MISSING_THIRD_BYTE)
|
181
|
+
}.should raise_error(Wikitext::Parser::Error, /truncated/)
|
182
|
+
lambda {
|
183
|
+
Wikitext::Parser.sanitize_link_target('good text' + UTF8::Invalid::FOUR_BYTES_MISSING_THIRD_BYTE)
|
184
|
+
}.should raise_error(Wikitext::Parser::Error, /truncated/)
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'should raise an exception for missing fourth byte in four-byte sequence' do
|
188
|
+
lambda {
|
189
|
+
Wikitext::Parser.sanitize_link_target(UTF8::Invalid::FOUR_BYTES_MISSING_FOURTH_BYTE)
|
190
|
+
}.should raise_error(Wikitext::Parser::Error, /truncated/)
|
191
|
+
lambda {
|
192
|
+
Wikitext::Parser.sanitize_link_target('good text' + UTF8::Invalid::FOUR_BYTES_MISSING_FOURTH_BYTE)
|
193
|
+
}.should raise_error(Wikitext::Parser::Error, /truncated/)
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'should raise an exception for illegal first byte in four-byte sequence' do
|
197
|
+
lambda {
|
198
|
+
Wikitext::Parser.sanitize_link_target(UTF8::Invalid::FOUR_BYTES_ILLEGAL_FIRST_BYTE)
|
199
|
+
}.should raise_error(Wikitext::Parser::Error, /overlong/)
|
200
|
+
lambda {
|
201
|
+
Wikitext::Parser.sanitize_link_target('good text' + UTF8::Invalid::FOUR_BYTES_ILLEGAL_FIRST_BYTE)
|
202
|
+
}.should raise_error(Wikitext::Parser::Error, /overlong/)
|
203
|
+
|
204
|
+
lambda {
|
205
|
+
Wikitext::Parser.sanitize_link_target(UTF8::Invalid::FOUR_BYTES_ILLEGAL_FIRST_BYTE_ALT)
|
206
|
+
}.should raise_error(Wikitext::Parser::Error, /overlong/)
|
207
|
+
lambda {
|
208
|
+
Wikitext::Parser.sanitize_link_target('good text' + UTF8::Invalid::FOUR_BYTES_ILLEGAL_FIRST_BYTE_ALT)
|
209
|
+
}.should raise_error(Wikitext::Parser::Error, /overlong/)
|
210
|
+
|
211
|
+
lambda {
|
212
|
+
Wikitext::Parser.sanitize_link_target(UTF8::Invalid::FOUR_BYTES_ILLEGAL_FIRST_BYTE_ALT2)
|
213
|
+
}.should raise_error(Wikitext::Parser::Error, /overlong/)
|
214
|
+
lambda {
|
215
|
+
Wikitext::Parser.sanitize_link_target('good text' + UTF8::Invalid::FOUR_BYTES_ILLEGAL_FIRST_BYTE_ALT2)
|
216
|
+
}.should raise_error(Wikitext::Parser::Error, /overlong/)
|
217
|
+
end
|
218
|
+
|
219
|
+
it 'should raise an exception for unexpected bytes' do
|
220
|
+
lambda {
|
221
|
+
Wikitext::Parser.sanitize_link_target(UTF8::Invalid::UNEXPECTED_BYTE)
|
222
|
+
}.should raise_error(Wikitext::Parser::Error, /unexpected/)
|
223
|
+
lambda {
|
224
|
+
Wikitext::Parser.sanitize_link_target('good text' + UTF8::Invalid::UNEXPECTED_BYTE)
|
225
|
+
}.should raise_error(Wikitext::Parser::Error, /unexpected/)
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
data/spec/nowiki_spec.rb
ADDED
@@ -0,0 +1,155 @@
|
|
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 <nowiki> spans' do
|
20
|
+
before do
|
21
|
+
@parser = Wikitext::Parser.new
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should not echo paired <nowiki> and </nowiki> tags' do
|
25
|
+
@parser.parse('foo <nowiki>bar</nowiki> baz').should == "<p>foo bar baz</p>\n"
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should automatically handle missing closing tags (at end of outpt)' do
|
29
|
+
# note that CRLF doesn't auto-terminate a <nowiki> span, unlike other inline spans
|
30
|
+
@parser.parse('foo <nowiki>bar').should == "<p>foo bar</p>\n"
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should unconditionally echo newlines inside <nowiki> spans' do
|
34
|
+
@parser.parse("<nowiki>foo\nbar</nowiki>").should == "<p>foo\nbar</p>\n"
|
35
|
+
@parser.parse("<nowiki>foo\n\nbar</nowiki>").should == "<p>foo\n\nbar</p>\n"
|
36
|
+
@parser.parse("<nowiki>foo\n\n\nbar</nowiki>").should == "<p>foo\n\n\nbar</p>\n"
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should convert unexpected closing tags into entities' do
|
40
|
+
@parser.parse('foo </nowiki>bar').should == "<p>foo </nowiki>bar</p>\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should convert nested opening tags into entities' do
|
44
|
+
@parser.parse('<nowiki>foo<nowiki>bar</nowiki>baz').should == "<p>foo<nowiki>barbaz</p>\n"
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should have no effect inside <pre> blocks' do
|
48
|
+
@parser.parse(' <nowiki>foo</nowiki>').should == "<pre><nowiki>foo</nowiki></pre>\n"
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should pass short BLOCKQUOTE tokens through without any special meaning' do
|
52
|
+
@parser.parse("<nowiki>\n></nowiki>").should == "<p>\n></p>\n"
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should pass long BLOCKQUOTE tokens through without any special meaning' do
|
56
|
+
@parser.parse("<nowiki>\n> </nowiki>").should == "<p>\n> </p>\n"
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should pass <tt> and </tt> tags through without any special meaning' do
|
60
|
+
@parser.parse('<nowiki>foo <tt>bar</tt></nowiki>').should == "<p>foo <tt>bar</tt></p>\n"
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should pass <em> and </em> tags through without any special meaning' do
|
64
|
+
@parser.parse("<nowiki>foo ''bar''</nowiki>").should == "<p>foo ''bar''</p>\n"
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should pass <strong> and </strong> tags through without any special meaning' do
|
68
|
+
@parser.parse("<nowiki>foo '''bar'''</nowiki>").should == "<p>foo '''bar'''</p>\n"
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should pass combined <strong>/<em> and </strong>/</em> tags through without any special meaning' do
|
72
|
+
@parser.parse("<nowiki>foo '''''bar'''''</nowiki>").should == "<p>foo '''''bar'''''</p>\n"
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'should pass <h1> tags through without any special meaning' do
|
76
|
+
@parser.parse("<nowiki>\n= foo</nowiki>").should == "<p>\n= foo</p>\n"
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'should pass </h1> tags through without any special meaning' do
|
80
|
+
@parser.parse("<nowiki>foo =\n</nowiki>").should == "<p>foo =\n</p>\n"
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should pass <h2> tags through without any special meaning' do
|
84
|
+
@parser.parse("<nowiki>\n== foo</nowiki>").should == "<p>\n== foo</p>\n"
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'should pass </h2> tags through without any special meaning' do
|
88
|
+
@parser.parse("<nowiki>foo ==\n</nowiki>").should == "<p>foo ==\n</p>\n"
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should pass <h3> tags through without any special meaning' do
|
92
|
+
@parser.parse("<nowiki>\n=== foo</nowiki>").should == "<p>\n=== foo</p>\n"
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should pass </h3> tags through without any special meaning' do
|
96
|
+
@parser.parse("<nowiki>foo ===\n</nowiki>").should == "<p>foo ===\n</p>\n"
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'should pass <h4> tags through without any special meaning' do
|
100
|
+
@parser.parse("<nowiki>\n==== foo</nowiki>").should == "<p>\n==== foo</p>\n"
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'should pass </h4> tags through without any special meaning' do
|
104
|
+
@parser.parse("<nowiki>foo ====\n</nowiki>").should == "<p>foo ====\n</p>\n"
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'should pass <h5> tags through without any special meaning' do
|
108
|
+
@parser.parse("<nowiki>\n===== foo</nowiki>").should == "<p>\n===== foo</p>\n"
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'should pass </h5> tags through without any special meaning' do
|
112
|
+
@parser.parse("<nowiki>foo =====\n</nowiki>").should == "<p>foo =====\n</p>\n"
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'should pass <h6> tags through without any special meaning' do
|
116
|
+
@parser.parse("<nowiki>\n====== foo</nowiki>").should == "<p>\n====== foo</p>\n"
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should pass </h6> tags through without any special meaning' do
|
120
|
+
@parser.parse("<nowiki>foo ======\n</nowiki>").should == "<p>foo ======\n</p>\n"
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should pass link start tokens through unchanged' do
|
124
|
+
@parser.parse('<nowiki>[[</nowiki>').should == "<p>[[</p>\n"
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'should pass link end tokens through unchanged' do
|
128
|
+
@parser.parse('<nowiki>]]</nowiki>').should == "<p>]]</p>\n"
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should pass external link start tokens through unchanged' do
|
132
|
+
@parser.parse('<nowiki>[</nowiki>').should == "<p>[</p>\n"
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'should pass external link end tokens through unchanged' do
|
136
|
+
@parser.parse('<nowiki>]</nowiki>').should == "<p>]</p>\n"
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'should pass named entities through unchanged' do
|
140
|
+
@parser.parse('<nowiki>€</nowiki>').should == "<p>€</p>\n"
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'should pass numeric (decimal) entities through unchanged' do
|
144
|
+
@parser.parse('<nowiki>€</nowiki>').should == "<p>€</p>\n"
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'should pass numeric (hexadecimal) entities through unchanged' do
|
148
|
+
@parser.parse('<nowiki>€</nowiki>').should == "<p>€</p>\n"
|
149
|
+
@parser.parse('<nowiki>€</nowiki>').should == "<p>€</p>\n"
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'should convert non-ASCII characters to numeric entities' do
|
153
|
+
@parser.parse('<nowiki>€</nowiki>').should == "<p>€</p>\n"
|
154
|
+
end
|
155
|
+
end
|