wikitext 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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