wikitext 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/spec/p_spec.rb ADDED
@@ -0,0 +1,44 @@
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 paragraphs' do
20
+ before do
21
+ @parser = Wikitext::Parser.new
22
+ end
23
+
24
+ it 'should wrap bare text in paragraph tags' do
25
+ @parser.parse('foo').should == "<p>foo</p>\n"
26
+ end
27
+
28
+ it 'should treat consecutive line breaks as paragraph breaks' do
29
+ @parser.parse("foo\n\nbar").should == "<p>foo</p>\n<p>bar</p>\n"
30
+ end
31
+
32
+ it 'should not insert excess empty paragraphs or spaces when processing multiple consecutive line breaks' do
33
+ @parser.parse("foo\n\n\n\nbar").should == "<p>foo</p>\n<p>bar</p>\n"
34
+ end
35
+
36
+ it 'should not translate single line breaks into spaces when they appear at the start of a paragraph' do
37
+ @parser.parse("\nfoo").should == "<p>foo</p>\n"
38
+ end
39
+
40
+ it 'should not translate single line breaks into spaces when they appear at the end of a paragraph' do
41
+ @parser.parse("foo\n").should == "<p>foo</p>\n"
42
+ end
43
+ end
44
+
data/spec/pre_spec.rb ADDED
@@ -0,0 +1,411 @@
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 PRE blocks' do
20
+ before do
21
+ @parser = Wikitext::Parser.new
22
+ end
23
+
24
+ it 'should recognize a single-line <pre> block' do
25
+ @parser.parse(' foo').should == "<pre>foo</pre>\n"
26
+ end
27
+
28
+ it 'should recognize a multiline <pre> block' do
29
+ @parser.parse(" foo\n bar").should == "<pre>foo\nbar</pre>\n"
30
+ end
31
+
32
+ it 'should allow nesting inside a <blockquote> block' do
33
+ # nesting inside single blockquotes
34
+ @parser.parse("> foo").should == "<blockquote>\n <pre>foo</pre>\n</blockquote>\n"
35
+
36
+ # same, but continued over multiple lines
37
+ @parser.parse("> foo\n> bar").should == "<blockquote>\n <pre>foo\nbar</pre>\n</blockquote>\n"
38
+
39
+ # nesting inside double blockquotes
40
+ expected = dedent <<-END
41
+ <blockquote>
42
+ <blockquote>
43
+ <pre>foo</pre>
44
+ </blockquote>
45
+ </blockquote>
46
+ END
47
+ @parser.parse("> > foo").should == expected
48
+
49
+ # same, but continued over multiple lines
50
+ expected = dedent <<-END
51
+ <blockquote>
52
+ <blockquote>
53
+ <pre>foo
54
+ bar</pre>
55
+ </blockquote>
56
+ </blockquote>
57
+ END
58
+ @parser.parse("> > foo\n> > bar").should == expected
59
+ end
60
+
61
+ it 'should automatically close preceding blocks at the same depth' do
62
+ @parser.parse("> foo\n bar").should == "<blockquote>\n <p>foo</p>\n</blockquote>\n<pre>bar</pre>\n"
63
+ expected = dedent <<-END
64
+ <blockquote>
65
+ <blockquote>
66
+ <p>foo</p>
67
+ </blockquote>
68
+ </blockquote>
69
+ <pre>bar</pre>
70
+ END
71
+ @parser.parse("> > foo\n bar").should == expected
72
+ end
73
+
74
+ it 'should pass <tt> and </tt> tags through without any special meaning' do
75
+ @parser.parse(' foo <tt>bar</tt>').should == "<pre>foo &lt;tt&gt;bar&lt;/tt&gt;</pre>\n"
76
+ end
77
+
78
+ it 'should pass <em> and </em> tags through without any special meaning' do
79
+ @parser.parse(" foo ''bar''").should == "<pre>foo ''bar''</pre>\n"
80
+ end
81
+
82
+ it 'should pass <strong> and </strong> tags through without any special meaning' do
83
+ @parser.parse(" foo '''bar'''").should == "<pre>foo '''bar'''</pre>\n"
84
+ end
85
+
86
+ it 'should pass combined <strong>/<em> and </strong>/</em> tags through without any special meaning' do
87
+ @parser.parse(" foo '''''bar'''''").should == "<pre>foo '''''bar'''''</pre>\n"
88
+ end
89
+
90
+ it 'should pass named entities through unchanged' do
91
+ @parser.parse(' &euro;').should == "<pre>&euro;</pre>\n"
92
+ end
93
+
94
+ it 'should pass numeric (decimal) entities through unchanged' do
95
+ @parser.parse(' &#8364;').should == "<pre>&#8364;</pre>\n"
96
+ end
97
+
98
+ it 'should pass numeric (hexadecimal) entities through unchanged' do
99
+ @parser.parse(' &#x20ac;').should == "<pre>&#x20ac;</pre>\n"
100
+ @parser.parse(' &#X20aC;').should == "<pre>&#x20ac;</pre>\n"
101
+ end
102
+
103
+ it 'should convert non-ASCII characters to numeric entities' do
104
+ @parser.parse(' €').should == "<pre>&#x20ac;</pre>\n"
105
+ end
106
+ end
107
+
108
+ describe Wikitext::Parser, 'parsing PRE_START/PRE_END blocks' do
109
+ before do
110
+ @parser = Wikitext::Parser.new
111
+ end
112
+
113
+ it 'should accept PRE_START/PRE_END as an alternative to the standard syntax' do
114
+ @parser.parse('<pre>foo</pre>').should == "<pre>foo</pre>\n"
115
+ end
116
+
117
+ it 'should pass through PRE unchanged in PRE_START/PRE_END blocks' do
118
+ input = dedent <<-END
119
+ <pre>line 1
120
+ next line</pre>
121
+ END
122
+ expected = dedent <<-END
123
+ <pre>line 1
124
+ next line</pre>
125
+ END
126
+ @parser.parse(input).should == expected
127
+ end
128
+
129
+ it 'should pass through short BLOCKQUOTE tokens as named entities in PRE_START/PRE_END blocks' do
130
+ input = dedent <<-END
131
+ <pre>line 1
132
+ >next line</pre>
133
+ END
134
+ expected = dedent <<-END
135
+ <pre>line 1
136
+ &gt;next line</pre>
137
+ END
138
+ @parser.parse(input).should == expected
139
+ end
140
+
141
+ it 'should pass through long BLOCKQUOTE tokens as named entities in PRE_START/PRE_END blocks' do
142
+ input = dedent <<-END
143
+ <pre>line 1
144
+ > next line</pre>
145
+ END
146
+ expected = dedent <<-END
147
+ <pre>line 1
148
+ &gt; next line</pre>
149
+ END
150
+ @parser.parse(input).should == expected
151
+ end
152
+
153
+ it 'should pass through EM unchanged in PRE_START/PRE_END blocks' do
154
+ @parser.parse("<pre>''</pre>").should == "<pre>''</pre>\n"
155
+ end
156
+
157
+ it 'should pass through STRONG unchanged in PRE_START/PRE_END blocks' do
158
+ @parser.parse("<pre>'''</pre>").should == "<pre>'''</pre>\n"
159
+ end
160
+
161
+ it 'should pass through STRONG_EM unchanged in PRE_START/PRE_END blocks' do
162
+ @parser.parse("<pre>'''''</pre>").should == "<pre>'''''</pre>\n"
163
+ end
164
+
165
+ it 'should pass through EM_START escaped in PRE_START/PRE_END blocks' do
166
+ @parser.parse("<pre><em></pre>").should == "<pre>&lt;em&gt;</pre>\n"
167
+ end
168
+
169
+ it 'should pass through EM_END escaped in PRE_START/PRE_END blocks' do
170
+ @parser.parse("<pre></em></pre>").should == "<pre>&lt;/em&gt;</pre>\n"
171
+ end
172
+
173
+ it 'should pass through STRONG_START escaped in PRE_START/PRE_END blocks' do
174
+ @parser.parse("<pre><strong></pre>").should == "<pre>&lt;strong&gt;</pre>\n"
175
+ end
176
+
177
+ it 'should pass through STRONG_END escaped in PRE_START/PRE_END blocks' do
178
+ @parser.parse("<pre></strong></pre>").should == "<pre>&lt;/strong&gt;</pre>\n"
179
+ end
180
+
181
+ it 'should pass through TT unchanged in PRE_START/PRE_END blocks' do
182
+ @parser.parse("<pre>`</pre>").should == "<pre>`</pre>\n"
183
+ end
184
+
185
+ it 'should pass through TT_START escaped in PRE_START/PRE_END blocks' do
186
+ @parser.parse("<pre><tt></pre>").should == "<pre>&lt;tt&gt;</pre>\n"
187
+ end
188
+
189
+ it 'should pass through TT_END escaped in PRE_START/PRE_END blocks' do
190
+ @parser.parse("<pre></tt></pre>").should == "<pre>&lt;/tt&gt;</pre>\n"
191
+ end
192
+
193
+ it 'should pass through UL unchanged in PRE_START/PRE_END blocks' do
194
+ @parser.parse("<pre>\n#</pre>").should == "<pre>\n#</pre>\n"
195
+ end
196
+
197
+ it 'should pass through OL unchanged in PRE_START/PRE_END blocks' do
198
+ @parser.parse("<pre>\n*</pre>").should == "<pre>\n*</pre>\n"
199
+ end
200
+
201
+ it 'should ignore PRE_START inside <nowiki> spans' do
202
+ @parser.parse('<nowiki><pre></nowiki>').should == "<p>&lt;pre&gt;</p>\n"
203
+ end
204
+
205
+ it 'should ignore PRE_END inside <nowiki> spans' do
206
+ @parser.parse('<nowiki></pre></nowiki>').should == "<p>&lt;/pre&gt;</p>\n"
207
+ end
208
+
209
+ it 'should ignore PRE_START inside standard PRE blocks' do
210
+ @parser.parse(' <pre>').should == "<pre>&lt;pre&gt;</pre>\n"
211
+ end
212
+
213
+ it 'should ignore PRE_END inside standard PRE blocks' do
214
+ @parser.parse(' </pre>').should == "<pre>&lt;/pre&gt;</pre>\n"
215
+ end
216
+
217
+ it 'should ignore PRE_START inside already open PRE_START blocks' do
218
+ @parser.parse('<pre><pre></pre>').should == "<pre>&lt;pre&gt;</pre>\n"
219
+ end
220
+
221
+ it 'should ignore PRE_START inside BLOCKQUOTE blocks' do
222
+ expected = dedent <<-END
223
+ <blockquote>
224
+ <p>&lt;pre&gt;</p>
225
+ </blockquote>
226
+ END
227
+ @parser.parse('> <pre>').should == expected
228
+ end
229
+
230
+ it 'should ignore PRE_END inside BLOCKQUOTE blocks' do
231
+ expected = dedent <<-END
232
+ <blockquote>
233
+ <p>&lt;/pre&gt;</p>
234
+ </blockquote>
235
+ END
236
+ @parser.parse('> </pre>').should == expected
237
+ end
238
+
239
+ it 'should ignore PRE_START inside UL blocks' do
240
+ expected = dedent <<-END
241
+ <ul>
242
+ <li>&lt;pre&gt;</li>
243
+ </ul>
244
+ END
245
+ @parser.parse('* <pre>').should == expected
246
+ end
247
+
248
+ it 'should ignore PRE_END inside UL blocks' do
249
+ expected = dedent <<-END
250
+ <ul>
251
+ <li>&lt;/pre&gt;</li>
252
+ </ul>
253
+ END
254
+ @parser.parse('* </pre>').should == expected
255
+ end
256
+
257
+ it 'should ignore PRE_START inside OL blocks' do
258
+ expected = dedent <<-END
259
+ <ol>
260
+ <li>&lt;pre&gt;</li>
261
+ </ol>
262
+ END
263
+ @parser.parse('# <pre>').should == expected
264
+ end
265
+
266
+ it 'should ignore PRE_END inside OL blocks' do
267
+ expected = dedent <<-END
268
+ <ol>
269
+ <li>&lt;/pre&gt;</li>
270
+ </ol>
271
+ END
272
+ @parser.parse('# </pre>').should == expected
273
+ end
274
+
275
+ it 'should ignore PRE_START inside H1 blocks' do
276
+ @parser.parse('= <pre> =').should == "<h1>&lt;pre&gt;</h1>\n"
277
+ end
278
+
279
+ it 'should ignore PRE_END inside H1 blocks' do
280
+ @parser.parse('= </pre> =').should == "<h1>&lt;/pre&gt;</h1>\n"
281
+ end
282
+
283
+ it 'should ignore PRE_START inside H2 blocks' do
284
+ @parser.parse('== <pre> ==').should == "<h2>&lt;pre&gt;</h2>\n"
285
+ end
286
+
287
+ it 'should ignore PRE_END inside H2 blocks' do
288
+ @parser.parse('== </pre> ==').should == "<h2>&lt;/pre&gt;</h2>\n"
289
+ end
290
+
291
+ it 'should ignore PRE_START inside H3 blocks' do
292
+ @parser.parse('=== <pre> ===').should == "<h3>&lt;pre&gt;</h3>\n"
293
+ end
294
+
295
+ it 'should ignore PRE_END inside H3 blocks' do
296
+ @parser.parse('=== </pre> ===').should == "<h3>&lt;/pre&gt;</h3>\n"
297
+ end
298
+
299
+ it 'should ignore PRE_START inside H4 blocks' do
300
+ @parser.parse('==== <pre> ====').should == "<h4>&lt;pre&gt;</h4>\n"
301
+ end
302
+
303
+ it 'should ignore PRE_END inside H4 blocks' do
304
+ @parser.parse('==== </pre> ====').should == "<h4>&lt;/pre&gt;</h4>\n"
305
+ end
306
+
307
+ it 'should ignore PRE_START inside H5 blocks' do
308
+ @parser.parse('===== <pre> =====').should == "<h5>&lt;pre&gt;</h5>\n"
309
+ end
310
+
311
+ it 'should ignore PRE_END inside H5 blocks' do
312
+ @parser.parse('===== </pre> =====').should == "<h5>&lt;/pre&gt;</h5>\n"
313
+ end
314
+
315
+ it 'should ignore PRE_START inside H6 blocks' do
316
+ @parser.parse('====== <pre> ======').should == "<h6>&lt;pre&gt;</h6>\n"
317
+ end
318
+
319
+ it 'should ignore PRE_END inside H6 blocks' do
320
+ @parser.parse('====== </pre> ======').should == "<h6>&lt;/pre&gt;</h6>\n"
321
+ end
322
+
323
+ it 'should start a <pre> block on seeing PRE_START partway through a P block' do
324
+ # the trailing space after "hello" is preserved just like it would be if the input were "hello " and nothing else
325
+ expected = dedent <<-END
326
+ <p>hello </p>
327
+ <pre>world</pre>
328
+ END
329
+ @parser.parse('hello <pre>world</pre>').should == expected
330
+ end
331
+
332
+ it 'should close any open spans while starting a <pre> block on seeing PRE_START partway through a P block' do
333
+ # ''
334
+ expected = dedent <<-END
335
+ <p>hello <em>my </em></p>
336
+ <pre>world</pre>
337
+ END
338
+ @parser.parse("hello ''my <pre>world</pre>").should == expected
339
+
340
+ # '''
341
+ expected = dedent <<-END
342
+ <p>hello <strong>my </strong></p>
343
+ <pre>world</pre>
344
+ END
345
+ @parser.parse("hello '''my <pre>world</pre>").should == expected
346
+
347
+ # '''''
348
+ expected = dedent <<-END
349
+ <p>hello <strong><em>my </em></strong></p>
350
+ <pre>world</pre>
351
+ END
352
+ @parser.parse("hello '''''my <pre>world</pre>").should == expected
353
+
354
+ # `
355
+ expected = dedent <<-END
356
+ <p>hello <tt>my </tt></p>
357
+ <pre>world</pre>
358
+ END
359
+ @parser.parse("hello `my <pre>world</pre>").should == expected
360
+
361
+ # <em>
362
+ expected = dedent <<-END
363
+ <p>hello <em>my </em></p>
364
+ <pre>world</pre>
365
+ END
366
+ @parser.parse("hello <em>my <pre>world</pre>").should == expected
367
+
368
+ # <strong>
369
+ expected = dedent <<-END
370
+ <p>hello <strong>my </strong></p>
371
+ <pre>world</pre>
372
+ END
373
+ @parser.parse("hello <strong>my <pre>world</pre>").should == expected
374
+
375
+ # <strong><em>
376
+ expected = dedent <<-END
377
+ <p>hello <strong><em>my </em></strong></p>
378
+ <pre>world</pre>
379
+ END
380
+ @parser.parse("hello <strong><em>my <pre>world</pre>").should == expected
381
+
382
+ # <tt>
383
+ expected = dedent <<-END
384
+ <p>hello <tt>my </tt></p>
385
+ <pre>world</pre>
386
+ END
387
+ @parser.parse("hello <tt>my <pre>world</pre>").should == expected
388
+ end
389
+
390
+ it 'should rollback open internal link spans on encountering a PRE_START in the link target' do
391
+ expected = dedent <<-END
392
+ <p>[[hello </p>
393
+ <pre>world</pre>
394
+ <p>]]</p>
395
+ END
396
+ @parser.parse('[[hello <pre>world</pre>]]').should == expected
397
+ end
398
+
399
+ it 'should rollback open internal link spans on encountering a PRE_START in the link text' do
400
+ expected = dedent <<-END
401
+ <p>[[hello | there</p>
402
+ <pre>world</pre>
403
+ <p>]]</p>
404
+ END
405
+ @parser.parse('[[hello | there<pre>world</pre>]]').should == expected
406
+ end
407
+
408
+ it 'should automatically close open PRE_START blocks on hitting the end-of-file' do
409
+ @parser.parse('<pre>foo').should == "<pre>foo</pre>\n"
410
+ end
411
+ end