creole 0.3.3 → 0.3.4
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/lib/creole.rb +264 -278
- data/test/test_creole.rb +622 -6
- metadata +1 -2
- data/test/testcases.rb +0 -631
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: creole
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lars Christensen
|
@@ -40,7 +40,6 @@ files:
|
|
40
40
|
- Rakefile
|
41
41
|
- lib/creole.rb
|
42
42
|
- test/test_creole.rb
|
43
|
-
- test/testcases.rb
|
44
43
|
has_rdoc: true
|
45
44
|
homepage: http://github.com/minad/creole
|
46
45
|
post_install_message:
|
data/test/testcases.rb
DELETED
@@ -1,631 +0,0 @@
|
|
1
|
-
require 'cgi'
|
2
|
-
|
3
|
-
# Test cases for the creole converter. These are included into the
|
4
|
-
# unittests, but is implemented as a separated module to be able to
|
5
|
-
# import them into demo wikis.
|
6
|
-
#
|
7
|
-
# Each test case should simply call the 'tc' method with the expected
|
8
|
-
# HTML and input Creole formatted text as arguments. The expected HTML
|
9
|
-
# should contain minimal amount of whitespace (only the absolutely
|
10
|
-
# required).
|
11
|
-
|
12
|
-
module TestCases
|
13
|
-
def escape_html(html)
|
14
|
-
CGI::escapeHTML(html)
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_bold
|
18
|
-
# Creole1.0: Bold can be used inside paragraphs
|
19
|
-
tc "<p>This <strong>is</strong> bold</p>", "This **is** bold"
|
20
|
-
tc "<p>This <strong>is</strong> bold and <strong>bold</strong>ish</p>", "This **is** bold and **bold**ish"
|
21
|
-
|
22
|
-
# Creole1.0: Bold can be used inside list items
|
23
|
-
tc "<ul><li>This is <strong>bold</strong></li></ul>", "* This is **bold**"
|
24
|
-
|
25
|
-
# Creole1.0: Bold can be used inside table cells
|
26
|
-
tc("<table><tr><td>This is <strong>bold</strong></td></tr></table>",
|
27
|
-
"|This is **bold**|")
|
28
|
-
|
29
|
-
# Creole1.0: Links can appear inside bold text:
|
30
|
-
tc("<p>A bold link: <strong><a href=\"http://wikicreole.org/\">http://wikicreole.org/</a> nice!</strong></p>",
|
31
|
-
"A bold link: **http://wikicreole.org/ nice!**")
|
32
|
-
|
33
|
-
# Creole1.0: Bold will end at the end of paragraph
|
34
|
-
tc "<p>This <strong>is bold</strong></p>", "This **is bold"
|
35
|
-
|
36
|
-
# Creole1.0: Bold will end at the end of list items
|
37
|
-
tc("<ul><li>Item <strong>bold</strong></li><li>Item normal</li></ul>",
|
38
|
-
"* Item **bold\n* Item normal")
|
39
|
-
|
40
|
-
# Creole1.0: Bold will end at the end of table cells
|
41
|
-
tc("<table><tr><td>Item <strong>bold</strong></td><td>Another <strong>bold</strong></td></tr></table>",
|
42
|
-
"|Item **bold|Another **bold")
|
43
|
-
|
44
|
-
# Creole1.0: Bold should not cross paragraphs
|
45
|
-
tc("<p>This <strong>is</strong></p><p>bold<strong> maybe</strong></p>",
|
46
|
-
"This **is\n\nbold** maybe")
|
47
|
-
|
48
|
-
# Creole1.0-Implied: Bold should be able to cross lines
|
49
|
-
tc "<p>This <strong>is bold</strong></p>", "This **is\nbold**"
|
50
|
-
end
|
51
|
-
|
52
|
-
def test_italic
|
53
|
-
# Creole1.0: Italic can be used inside paragraphs
|
54
|
-
tc("<p>This <em>is</em> italic</p>",
|
55
|
-
"This //is// italic")
|
56
|
-
tc("<p>This <em>is</em> italic and <em>italic</em>ish</p>",
|
57
|
-
"This //is// italic and //italic//ish")
|
58
|
-
|
59
|
-
# Creole1.0: Italic can be used inside list items
|
60
|
-
tc "<ul><li>This is <em>italic</em></li></ul>", "* This is //italic//"
|
61
|
-
|
62
|
-
# Creole1.0: Italic can be used inside table cells
|
63
|
-
tc("<table><tr><td>This is <em>italic</em></td></tr></table>",
|
64
|
-
"|This is //italic//|")
|
65
|
-
|
66
|
-
# Creole1.0: Links can appear inside italic text:
|
67
|
-
tc("<p>A italic link: <em><a href=\"http://wikicreole.org/\">http://wikicreole.org/</a> nice!</em></p>",
|
68
|
-
"A italic link: //http://wikicreole.org/ nice!//")
|
69
|
-
|
70
|
-
# Creole1.0: Italic will end at the end of paragraph
|
71
|
-
tc "<p>This <em>is italic</em></p>", "This //is italic"
|
72
|
-
|
73
|
-
# Creole1.0: Italic will end at the end of list items
|
74
|
-
tc("<ul><li>Item <em>italic</em></li><li>Item normal</li></ul>",
|
75
|
-
"* Item //italic\n* Item normal")
|
76
|
-
|
77
|
-
# Creole1.0: Italic will end at the end of table cells
|
78
|
-
tc("<table><tr><td>Item <em>italic</em></td><td>Another <em>italic</em></td></tr></table>",
|
79
|
-
"|Item //italic|Another //italic")
|
80
|
-
|
81
|
-
# Creole1.0: Italic should not cross paragraphs
|
82
|
-
tc("<p>This <em>is</em></p><p>italic<em> maybe</em></p>",
|
83
|
-
"This //is\n\nitalic// maybe")
|
84
|
-
|
85
|
-
# Creole1.0-Implied: Italic should be able to cross lines
|
86
|
-
tc "<p>This <em>is italic</em></p>", "This //is\nitalic//"
|
87
|
-
end
|
88
|
-
|
89
|
-
def test_bold_italics
|
90
|
-
# Creole1.0: By example
|
91
|
-
tc "<p><strong><em>bold italics</em></strong></p>", "**//bold italics//**"
|
92
|
-
|
93
|
-
# Creole1.0: By example
|
94
|
-
tc "<p><em><strong>bold italics</strong></em></p>", "//**bold italics**//"
|
95
|
-
|
96
|
-
# Creole1.0: By example
|
97
|
-
tc "<p><em>This is <strong>also</strong> good.</em></p>", "//This is **also** good.//"
|
98
|
-
end
|
99
|
-
|
100
|
-
def test_headings
|
101
|
-
# Creole1.0: Only three differed sized levels of heading are required.
|
102
|
-
tc "<h1>Heading 1</h1>", "= Heading 1 ="
|
103
|
-
tc "<h2>Heading 2</h2>", "== Heading 2 =="
|
104
|
-
tc "<h3>Heading 3</h3>", "=== Heading 3 ==="
|
105
|
-
unless $strict
|
106
|
-
tc "<h4>Heading 4</h4>", "==== Heading 4 ===="
|
107
|
-
tc "<h5>Heading 5</h5>", "===== Heading 5 ====="
|
108
|
-
tc "<h6>Heading 6</h6>", "====== Heading 6 ======"
|
109
|
-
end
|
110
|
-
|
111
|
-
# Creole1.0: Closing (right-side) equal signs are optional
|
112
|
-
tc "<h1>Heading 1</h1>", "=Heading 1"
|
113
|
-
tc "<h2>Heading 2</h2>", "== Heading 2"
|
114
|
-
tc "<h3>Heading 3</h3>", " === Heading 3"
|
115
|
-
|
116
|
-
# Creole1.0: Closing (right-side) equal signs don't need to be balanced and don't impact the kind of heading generated
|
117
|
-
tc "<h1>Heading 1</h1>", "=Heading 1 ==="
|
118
|
-
tc "<h2>Heading 2</h2>", "== Heading 2 ="
|
119
|
-
tc "<h3>Heading 3</h3>", " === Heading 3 ==========="
|
120
|
-
|
121
|
-
# Creole1.0: Whitespace is allowed before the left-side equal signs.
|
122
|
-
tc "<h1>Heading 1</h1>", " \t= Heading 1 ="
|
123
|
-
tc "<h2>Heading 2</h2>", " \t== Heading 2 =="
|
124
|
-
|
125
|
-
# Creole1.0: Only white-space characters are permitted after the closing equal signs.
|
126
|
-
tc "<h1>Heading 1</h1>", " = Heading 1 = "
|
127
|
-
tc "<h2>Heading 2</h2>", " == Heading 2 == \t "
|
128
|
-
|
129
|
-
# !!Creole1.0 doesn't specify if text after closing equal signs
|
130
|
-
# !!becomes part of the heading or invalidates the entire heading.
|
131
|
-
# tc "<p> == Heading 2 == foo</p>", " == Heading 2 == foo"
|
132
|
-
unless $strict
|
133
|
-
tc "<h2>Heading 2 == foo</h2>", " == Heading 2 == foo"
|
134
|
-
end
|
135
|
-
|
136
|
-
# Creole1.0-Implied: Line must start with equal sign
|
137
|
-
tc "<p>foo = Heading 1 =</p>", "foo = Heading 1 ="
|
138
|
-
end
|
139
|
-
|
140
|
-
def test_links
|
141
|
-
# Creole1.0: Links
|
142
|
-
tc "<p><a href=\"link\">link</a></p>", "[[link]]"
|
143
|
-
|
144
|
-
# Creole1.0: Links can appear in paragraphs (i.e. inline item)
|
145
|
-
tc "<p>Hello, <a href=\"world\">world</a></p>", "Hello, [[world]]"
|
146
|
-
|
147
|
-
# Creole1.0: Named links
|
148
|
-
tc "<p><a href=\"MyBigPage\">Go to my page</a></p>", "[[MyBigPage|Go to my page]]"
|
149
|
-
|
150
|
-
# Creole1.0: URLs
|
151
|
-
tc "<p><a href=\"http://www.wikicreole.org/\">http://www.wikicreole.org/</a></p>", "[[http://www.wikicreole.org/]]"
|
152
|
-
|
153
|
-
# Creole1.0: Free-standing URL's should be turned into links
|
154
|
-
tc "<p><a href=\"http://www.wikicreole.org/\">http://www.wikicreole.org/</a></p>", "http://www.wikicreole.org/"
|
155
|
-
|
156
|
-
# Creole1.0: Single punctuation characters at the end of URLs
|
157
|
-
# should not be considered a part of the URL.
|
158
|
-
[',','.','?','!',':',';','\'','"'].each { |punct|
|
159
|
-
esc_punct = escape_html(punct)
|
160
|
-
tc "<p><a href=\"http://www.wikicreole.org/\">http://www.wikicreole.org/</a>#{esc_punct}</p>", "http://www.wikicreole.org/#{punct}"
|
161
|
-
}
|
162
|
-
# Creole1.0: Nameds URLs (by example)
|
163
|
-
tc("<p><a href=\"http://www.wikicreole.org/\">Visit the WikiCreole website</a></p>",
|
164
|
-
"[[http://www.wikicreole.org/|Visit the WikiCreole website]]")
|
165
|
-
|
166
|
-
unless $strict
|
167
|
-
# Parsing markup within a link is optional
|
168
|
-
tc "<p><a href=\"Weird+Stuff\">**Weird** //Stuff//</a></p>", "[[Weird Stuff|**Weird** //Stuff//]]"
|
169
|
-
end
|
170
|
-
|
171
|
-
# Inside bold
|
172
|
-
tc "<p><strong><a href=\"link\">link</a></strong></p>", "**[[link]]**"
|
173
|
-
|
174
|
-
# Whitespace inside [[ ]] should be ignored
|
175
|
-
tc("<p><a href=\"link\">link</a></p>", "[[ link ]]")
|
176
|
-
tc("<p><a href=\"link+me\">link me</a></p>", "[[ link me ]]")
|
177
|
-
tc("<p><a href=\"http://dot.com/\">dot.com</a></p>", "[[ http://dot.com/ \t| \t dot.com ]]")
|
178
|
-
tc("<p><a href=\"http://dot.com/\">dot.com</a></p>", "[[ http://dot.com/ | dot.com ]]")
|
179
|
-
end
|
180
|
-
|
181
|
-
def test_paragraph
|
182
|
-
# Creole1.0: One or more blank lines end paragraphs.
|
183
|
-
tc "<p>This is my text.</p><p>This is more text.</p>", "This is\nmy text.\n\nThis is\nmore text."
|
184
|
-
tc "<p>This is my text.</p><p>This is more text.</p>", "This is\nmy text.\n\n\nThis is\nmore text."
|
185
|
-
tc "<p>This is my text.</p><p>This is more text.</p>", "This is\nmy text.\n\n\n\nThis is\nmore text."
|
186
|
-
|
187
|
-
# Creole1.0: A list end paragraphs too.
|
188
|
-
tc "<p>Hello</p><ul><li>Item</li></ul>", "Hello\n* Item\n"
|
189
|
-
|
190
|
-
# Creole1.0: A table end paragraphs too.
|
191
|
-
tc "<p>Hello</p><table><tr><td>Cell</td></tr></table>", "Hello\n|Cell|"
|
192
|
-
|
193
|
-
# Creole1.0: A nowiki end paragraphs too.
|
194
|
-
tc "<p>Hello</p><pre>nowiki</pre>", "Hello\n{{{\nnowiki\n}}}\n"
|
195
|
-
|
196
|
-
unless $strict
|
197
|
-
# A heading ends a paragraph (not specced)
|
198
|
-
tc "<p>Hello</p><h1>Heading</h1>", "Hello\n= Heading =\n"
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
def test_linebreak
|
203
|
-
# Creole1.0: \\ (wiki-style) for line breaks.
|
204
|
-
tc "<p>This is the first line,<br/>and this is the second.</p>", "This is the first line,\\\\and this is the second."
|
205
|
-
end
|
206
|
-
|
207
|
-
def test_unordered_lists
|
208
|
-
# Creole1.0: List items begin with a * at the beginning of a line.
|
209
|
-
# Creole1.0: An item ends at the next *
|
210
|
-
tc "<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li></ul>", "* Item 1\n *Item 2\n *\t\tItem 3\n"
|
211
|
-
|
212
|
-
# Creole1.0: Whitespace is optional before and after the *.
|
213
|
-
tc("<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li></ul>",
|
214
|
-
" * Item 1\n*Item 2\n \t*\t\tItem 3\n")
|
215
|
-
|
216
|
-
# Creole1.0: A space is required if if the list element starts with bold text.
|
217
|
-
tc("<ul><li><ul><li><ul><li>Item 1</li></ul></li></ul></li></ul>", "***Item 1")
|
218
|
-
tc("<ul><li><strong>Item 1</strong></li></ul>", "* **Item 1")
|
219
|
-
|
220
|
-
# Creole1.0: An item ends at blank line
|
221
|
-
tc("<ul><li>Item</li></ul><p>Par</p>", "* Item\n\nPar\n")
|
222
|
-
|
223
|
-
# Creole1.0: An item ends at a heading
|
224
|
-
tc("<ul><li>Item</li></ul><h1>Heading</h1>", "* Item\n= Heading =\n")
|
225
|
-
|
226
|
-
# Creole1.0: An item ends at a table
|
227
|
-
tc("<ul><li>Item</li></ul><table><tr><td>Cell</td></tr></table>", "* Item\n|Cell|\n")
|
228
|
-
|
229
|
-
# Creole1.0: An item ends at a nowiki block
|
230
|
-
tc("<ul><li>Item</li></ul><pre>Code</pre>", "* Item\n{{{\nCode\n}}}\n")
|
231
|
-
|
232
|
-
# Creole1.0: An item can span multiple lines
|
233
|
-
tc("<ul><li>The quick brown fox jumps over lazy dog.</li><li>Humpty Dumpty sat on a wall.</li></ul>",
|
234
|
-
"* The quick\nbrown fox\n\tjumps over\nlazy dog.\n*Humpty Dumpty\nsat\t\non a wall.")
|
235
|
-
|
236
|
-
# Creole1.0: An item can contain line breaks
|
237
|
-
tc("<ul><li>The quick brown<br/>fox jumps over lazy dog.</li></ul>",
|
238
|
-
"* The quick brown\\\\fox jumps over lazy dog.")
|
239
|
-
|
240
|
-
# Creole1.0: Nested
|
241
|
-
tc "<ul><li>Item 1<ul><li>Item 2</li></ul></li><li>Item 3</li></ul>", "* Item 1\n **Item 2\n *\t\tItem 3\n"
|
242
|
-
|
243
|
-
# Creole1.0: Nested up to 5 levels
|
244
|
-
tc("<ul><li>Item 1<ul><li>Item 2<ul><li>Item 3<ul><li>Item 4<ul><li>Item 5</li></ul></li></ul></li></ul></li></ul></li></ul>",
|
245
|
-
"*Item 1\n**Item 2\n***Item 3\n****Item 4\n*****Item 5\n")
|
246
|
-
|
247
|
-
# Creole1.0: ** immediatly following a list element will be treated as a nested unordered element.
|
248
|
-
tc("<ul><li>Hello, World!<ul><li>Not bold</li></ul></li></ul>",
|
249
|
-
"*Hello,\nWorld!\n**Not bold\n")
|
250
|
-
|
251
|
-
# Creole1.0: ** immediatly following a list element will be treated as a nested unordered element.
|
252
|
-
tc("<ol><li>Hello, World!<ul><li>Not bold</li></ul></li></ol>",
|
253
|
-
"#Hello,\nWorld!\n**Not bold\n")
|
254
|
-
|
255
|
-
# Creole1.0: [...] otherwise it will be treated as the beginning of bold text.
|
256
|
-
tc("<ul><li>Hello, World!</li></ul><p><strong>Not bold</strong></p>",
|
257
|
-
"*Hello,\nWorld!\n\n**Not bold\n")
|
258
|
-
end
|
259
|
-
|
260
|
-
def test_ordered_lists
|
261
|
-
# Creole1.0: List items begin with a * at the beginning of a line.
|
262
|
-
# Creole1.0: An item ends at the next *
|
263
|
-
tc "<ol><li>Item 1</li><li>Item 2</li><li>Item 3</li></ol>", "# Item 1\n #Item 2\n #\t\tItem 3\n"
|
264
|
-
|
265
|
-
# Creole1.0: Whitespace is optional before and after the #.
|
266
|
-
tc("<ol><li>Item 1</li><li>Item 2</li><li>Item 3</li></ol>",
|
267
|
-
" # Item 1\n#Item 2\n \t#\t\tItem 3\n")
|
268
|
-
|
269
|
-
# Creole1.0: A space is required if if the list element starts with bold text.
|
270
|
-
tc("<ol><li><ol><li><ol><li>Item 1</li></ol></li></ol></li></ol>", "###Item 1")
|
271
|
-
tc("<ol><li><strong>Item 1</strong></li></ol>", "# **Item 1")
|
272
|
-
|
273
|
-
# Creole1.0: An item ends at blank line
|
274
|
-
tc("<ol><li>Item</li></ol><p>Par</p>", "# Item\n\nPar\n")
|
275
|
-
|
276
|
-
# Creole1.0: An item ends at a heading
|
277
|
-
tc("<ol><li>Item</li></ol><h1>Heading</h1>", "# Item\n= Heading =\n")
|
278
|
-
|
279
|
-
# Creole1.0: An item ends at a table
|
280
|
-
tc("<ol><li>Item</li></ol><table><tr><td>Cell</td></tr></table>", "# Item\n|Cell|\n")
|
281
|
-
|
282
|
-
# Creole1.0: An item ends at a nowiki block
|
283
|
-
tc("<ol><li>Item</li></ol><pre>Code</pre>", "# Item\n{{{\nCode\n}}}\n")
|
284
|
-
|
285
|
-
# Creole1.0: An item can span multiple lines
|
286
|
-
tc("<ol><li>The quick brown fox jumps over lazy dog.</li><li>Humpty Dumpty sat on a wall.</li></ol>",
|
287
|
-
"# The quick\nbrown fox\n\tjumps over\nlazy dog.\n#Humpty Dumpty\nsat\t\non a wall.")
|
288
|
-
|
289
|
-
# Creole1.0: An item can contain line breaks
|
290
|
-
tc("<ol><li>The quick brown<br/>fox jumps over lazy dog.</li></ol>",
|
291
|
-
"# The quick brown\\\\fox jumps over lazy dog.")
|
292
|
-
|
293
|
-
# Creole1.0: Nested
|
294
|
-
tc "<ol><li>Item 1<ol><li>Item 2</li></ol></li><li>Item 3</li></ol>", "# Item 1\n ##Item 2\n #\t\tItem 3\n"
|
295
|
-
|
296
|
-
# Creole1.0: Nested up to 5 levels
|
297
|
-
tc("<ol><li>Item 1<ol><li>Item 2<ol><li>Item 3<ol><li>Item 4<ol><li>Item 5</li></ol></li></ol></li></ol></li></ol></li></ol>",
|
298
|
-
"#Item 1\n##Item 2\n###Item 3\n####Item 4\n#####Item 5\n")
|
299
|
-
|
300
|
-
# Creole1.0_Infered: The two-bullet rule only applies to **.
|
301
|
-
tc("<ol><li><ol><li>Item</li></ol></li></ol>", "##Item")
|
302
|
-
end
|
303
|
-
|
304
|
-
def test_ordered_lists2
|
305
|
-
tc "<ol><li>Item 1</li><li>Item 2</li><li>Item 3</li></ol>", "# Item 1\n #Item 2\n #\t\tItem 3\n"
|
306
|
-
# Nested
|
307
|
-
tc "<ol><li>Item 1<ol><li>Item 2</li></ol></li><li>Item 3</li></ol>", "# Item 1\n ##Item 2\n #\t\tItem 3\n"
|
308
|
-
# Multiline
|
309
|
-
tc "<ol><li>Item 1 on multiple lines</li></ol>", "# Item 1\non multiple lines"
|
310
|
-
end
|
311
|
-
|
312
|
-
def test_ambiguity_mixed_lists
|
313
|
-
# ol following ul
|
314
|
-
tc("<ul><li>uitem</li></ul><ol><li>oitem</li></ol>", "*uitem\n#oitem\n")
|
315
|
-
|
316
|
-
# ul following ol
|
317
|
-
tc("<ol><li>uitem</li></ol><ul><li>oitem</li></ul>", "#uitem\n*oitem\n")
|
318
|
-
|
319
|
-
# 2ol following ul
|
320
|
-
tc("<ul><li>uitem<ol><li>oitem</li></ol></li></ul>", "*uitem\n##oitem\n")
|
321
|
-
|
322
|
-
# 2ul following ol
|
323
|
-
tc("<ol><li>uitem<ul><li>oitem</li></ul></li></ol>", "#uitem\n**oitem\n")
|
324
|
-
|
325
|
-
# 3ol following 3ul
|
326
|
-
tc("<ul><li><ul><li><ul><li>uitem</li></ul><ol><li>oitem</li></ol></li></ul></li></ul>", "***uitem\n###oitem\n")
|
327
|
-
|
328
|
-
# 2ul following 2ol
|
329
|
-
tc("<ol><li><ol><li>uitem</li></ol><ul><li>oitem</li></ul></li></ol>", "##uitem\n**oitem\n")
|
330
|
-
|
331
|
-
# ol following 2ol
|
332
|
-
tc("<ol><li><ol><li>oitem1</li></ol></li><li>oitem2</li></ol>", "##oitem1\n#oitem2\n")
|
333
|
-
# ul following 2ol
|
334
|
-
tc("<ol><li><ol><li>oitem1</li></ol></li></ol><ul><li>oitem2</li></ul>", "##oitem1\n*oitem2\n")
|
335
|
-
end
|
336
|
-
|
337
|
-
def test_ambiguity_italics_and_url
|
338
|
-
# Uncommon URL schemes should not be parsed as URLs
|
339
|
-
tc("<p>This is what can go wrong:<em>this should be an italic text</em>.</p>",
|
340
|
-
"This is what can go wrong://this should be an italic text//.")
|
341
|
-
|
342
|
-
# A link inside italic text
|
343
|
-
tc("<p>How about <em>a link, like <a href=\"http://example.org\">http://example.org</a>, in italic</em> text?</p>",
|
344
|
-
"How about //a link, like http://example.org, in italic// text?")
|
345
|
-
|
346
|
-
# Another test from Creole Wiki
|
347
|
-
tc("<p>Formatted fruits, for example:<em>apples</em>, oranges, <strong>pears</strong> ...</p>",
|
348
|
-
"Formatted fruits, for example://apples//, oranges, **pears** ...")
|
349
|
-
|
350
|
-
tc("<p>Blablabala (<a href=\"http://blub.de\">http://blub.de</a>)</p>",
|
351
|
-
"Blablabala (http://blub.de)")
|
352
|
-
end
|
353
|
-
|
354
|
-
def test_ambiguity_bold_and_lists
|
355
|
-
tc "<p><strong> bold text </strong></p>", "** bold text **"
|
356
|
-
tc "<p> <strong> bold text </strong></p>", " ** bold text **"
|
357
|
-
end
|
358
|
-
|
359
|
-
def test_nowiki
|
360
|
-
# ... works as block
|
361
|
-
tc "<pre>Hello</pre>", "{{{\nHello\n}}}\n"
|
362
|
-
|
363
|
-
# ... works inline
|
364
|
-
tc "<p>Hello <tt>world</tt>.</p>", "Hello {{{world}}}."
|
365
|
-
|
366
|
-
# Creole1.0: No wiki markup is interpreted inbetween
|
367
|
-
tc "<pre>**Hello**</pre>", "{{{\n**Hello**\n}}}\n"
|
368
|
-
|
369
|
-
# Creole1.0: Leading whitespaces are not permitted
|
370
|
-
tc("<p> {{{ Hello }}}</p>", " {{{\nHello\n}}}")
|
371
|
-
tc("<p>{{{ Hello }}}</p>", "{{{\nHello\n }}}")
|
372
|
-
|
373
|
-
# Assumed: Should preserve whitespace
|
374
|
-
tc("<pre> \t Hello, \t \n \t World \t </pre>",
|
375
|
-
"{{{\n \t Hello, \t \n \t World \t \n}}}\n")
|
376
|
-
|
377
|
-
# In preformatted blocks ... one leading space is removed
|
378
|
-
tc("<pre>nowikiblock\n}}}</pre>", "{{{\nnowikiblock\n }}}\n}}}\n")
|
379
|
-
|
380
|
-
# In inline nowiki, any trailing closing brace is included in the span
|
381
|
-
tc("<p>this is <tt>nowiki}</tt></p>", "this is {{{nowiki}}}}")
|
382
|
-
tc("<p>this is <tt>nowiki}}</tt></p>", "this is {{{nowiki}}}}}")
|
383
|
-
tc("<p>this is <tt>nowiki}}}</tt></p>", "this is {{{nowiki}}}}}}")
|
384
|
-
tc("<p>this is <tt>nowiki}}}}</tt></p>", "this is {{{nowiki}}}}}}}")
|
385
|
-
end
|
386
|
-
|
387
|
-
def test_html_escaping
|
388
|
-
# Special HTML chars should be escaped
|
389
|
-
tc("<p><b>not bold</b></p>", "<b>not bold</b>")
|
390
|
-
|
391
|
-
# Image tags should be escape
|
392
|
-
tc("<p><img src=\"image.jpg\" alt=\""tag"\"/></p>", "{{image.jpg|\"tag\"}}")
|
393
|
-
|
394
|
-
# Malicious links should not be converted.
|
395
|
-
tc("<p><a href=\"javascript%3Aalert%28%22Boo%21%22%29\">Click</a></p>", "[[javascript:alert(\"Boo!\")|Click]]")
|
396
|
-
end
|
397
|
-
|
398
|
-
def test_escape
|
399
|
-
tc "<p>** Not Bold **</p>", "~** Not Bold ~**"
|
400
|
-
tc "<p>// Not Italic //</p>", "~// Not Italic ~//"
|
401
|
-
tc "<p>* Not Bullet</p>", "~* Not Bullet"
|
402
|
-
# Following char is not a blank (space or line feed)
|
403
|
-
tc "<p>Hello ~ world</p>", "Hello ~ world\n"
|
404
|
-
tc "<p>Hello ~ world</p>", "Hello ~\nworld\n"
|
405
|
-
# Not escaping inside URLs (Creole1.0 not clear on this)
|
406
|
-
tc "<p><a href=\"http://example.org/~user/\">http://example.org/~user/</a></p>", "http://example.org/~user/"
|
407
|
-
|
408
|
-
# Escaping links
|
409
|
-
tc "<p>http://www.wikicreole.org/</p>", "~http://www.wikicreole.org/"
|
410
|
-
end
|
411
|
-
|
412
|
-
def test_horizontal_rule
|
413
|
-
# Creole: Four hyphens make a horizontal rule
|
414
|
-
tc "<hr/>", "----"
|
415
|
-
|
416
|
-
# Creole1.0: Whitespace around them is allowed
|
417
|
-
tc "<hr/>", " ----"
|
418
|
-
tc "<hr/>", "---- "
|
419
|
-
tc "<hr/>", " ---- "
|
420
|
-
tc "<hr/>", " \t ---- \t "
|
421
|
-
|
422
|
-
# Creole1.0: Nothing else than hyphens and whitespace is "allowed"
|
423
|
-
tc "<p>foo ----</p>", "foo ----\n"
|
424
|
-
tc "<p>---- foo</p>", "---- foo\n"
|
425
|
-
|
426
|
-
# Creole1.0: [...] no whitespace is allowed between them
|
427
|
-
tc "<p> -- -- </p>", " -- -- "
|
428
|
-
tc "<p> -- -- </p>", " --\t-- "
|
429
|
-
end
|
430
|
-
|
431
|
-
def test_table
|
432
|
-
tc "<table><tr><td>Hello, World!</td></tr></table>", "|Hello, World!|"
|
433
|
-
# Multiple columns
|
434
|
-
tc "<table><tr><td>c1</td><td>c2</td><td>c3</td></tr></table>", "|c1|c2|c3|"
|
435
|
-
# Multiple rows
|
436
|
-
tc "<table><tr><td>c11</td><td>c12</td></tr><tr><td>c21</td><td>c22</td></tr></table>", "|c11|c12|\n|c21|c22|\n"
|
437
|
-
# End pipe is optional
|
438
|
-
tc "<table><tr><td>c1</td><td>c2</td><td>c3</td></tr></table>", "|c1|c2|c3"
|
439
|
-
# Empty cells
|
440
|
-
tc "<table><tr><td>c1</td><td></td><td>c3</td></tr></table>", "|c1||c3"
|
441
|
-
# Escaping cell separator
|
442
|
-
tc "<table><tr><td>c1|c2</td><td>c3</td></tr></table>", "|c1~|c2|c3"
|
443
|
-
# Escape in last cell + empty cell
|
444
|
-
tc "<table><tr><td>c1</td><td>c2|</td></tr></table>", "|c1|c2~|"
|
445
|
-
tc "<table><tr><td>c1</td><td>c2|</td></tr></table>", "|c1|c2~||"
|
446
|
-
tc "<table><tr><td>c1</td><td>c2|</td><td></td></tr></table>", "|c1|c2~|||"
|
447
|
-
# Equal sign after pipe make a header
|
448
|
-
tc "<table><tr><th>Header</th></tr></table>", "|=Header|"
|
449
|
-
|
450
|
-
tc "<table><tr><td>c1</td><td><a href=\"Link\">Link text</a></td><td><img src=\"Image\" alt=\"Image text\"/></td></tr></table>", "|c1|[[Link|Link text]]|{{Image|Image text}}|"
|
451
|
-
end
|
452
|
-
|
453
|
-
def test_following_table
|
454
|
-
# table followed by heading
|
455
|
-
tc("<table><tr><td>table</td></tr></table><h1>heading</h1>", "|table|\n=heading=\n")
|
456
|
-
tc("<table><tr><td>table</td></tr></table><h1>heading</h1>", "|table|\n\n=heading=\n")
|
457
|
-
# table followed by paragraph
|
458
|
-
tc("<table><tr><td>table</td></tr></table><p>par</p>", "|table|\npar\n")
|
459
|
-
tc("<table><tr><td>table</td></tr></table><p>par</p>", "|table|\n\npar\n")
|
460
|
-
# table followed by unordered list
|
461
|
-
tc("<table><tr><td>table</td></tr></table><ul><li>item</li></ul>", "|table|\n*item\n")
|
462
|
-
tc("<table><tr><td>table</td></tr></table><ul><li>item</li></ul>", "|table|\n\n*item\n")
|
463
|
-
# table followed by ordered list
|
464
|
-
tc("<table><tr><td>table</td></tr></table><ol><li>item</li></ol>", "|table|\n#item\n")
|
465
|
-
tc("<table><tr><td>table</td></tr></table><ol><li>item</li></ol>", "|table|\n\n#item\n")
|
466
|
-
# table followed by horizontal rule
|
467
|
-
tc("<table><tr><td>table</td></tr></table><hr/>", "|table|\n----\n")
|
468
|
-
tc("<table><tr><td>table</td></tr></table><hr/>", "|table|\n\n----\n")
|
469
|
-
# table followed by nowiki block
|
470
|
-
tc("<table><tr><td>table</td></tr></table><pre>pre</pre>", "|table|\n{{{\npre\n}}}\n")
|
471
|
-
tc("<table><tr><td>table</td></tr></table><pre>pre</pre>", "|table|\n\n{{{\npre\n}}}\n")
|
472
|
-
# table followed by table
|
473
|
-
tc("<table><tr><td>table</td></tr><tr><td>table</td></tr></table>", "|table|\n|table|\n")
|
474
|
-
tc("<table><tr><td>table</td></tr></table><table><tr><td>table</td></tr></table>", "|table|\n\n|table|\n")
|
475
|
-
end
|
476
|
-
|
477
|
-
def test_following_heading
|
478
|
-
# heading
|
479
|
-
tc("<h1>heading1</h1><h1>heading2</h1>", "=heading1=\n=heading2\n")
|
480
|
-
tc("<h1>heading1</h1><h1>heading2</h1>", "=heading1=\n\n=heading2\n")
|
481
|
-
# paragraph
|
482
|
-
tc("<h1>heading</h1><p>par</p>", "=heading=\npar\n")
|
483
|
-
tc("<h1>heading</h1><p>par</p>", "=heading=\n\npar\n")
|
484
|
-
# unordered list
|
485
|
-
tc("<h1>heading</h1><ul><li>item</li></ul>", "=heading=\n*item\n")
|
486
|
-
tc("<h1>heading</h1><ul><li>item</li></ul>", "=heading=\n\n*item\n")
|
487
|
-
# ordered list
|
488
|
-
tc("<h1>heading</h1><ol><li>item</li></ol>", "=heading=\n#item\n")
|
489
|
-
tc("<h1>heading</h1><ol><li>item</li></ol>", "=heading=\n\n#item\n")
|
490
|
-
# horizontal rule
|
491
|
-
tc("<h1>heading</h1><hr/>", "=heading=\n----\n")
|
492
|
-
tc("<h1>heading</h1><hr/>", "=heading=\n\n----\n")
|
493
|
-
# nowiki block
|
494
|
-
tc("<h1>heading</h1><pre>nowiki</pre>", "=heading=\n{{{\nnowiki\n}}}\n")
|
495
|
-
tc("<h1>heading</h1><pre>nowiki</pre>", "=heading=\n\n{{{\nnowiki\n}}}\n")
|
496
|
-
# table
|
497
|
-
tc("<h1>heading</h1><table><tr><td>table</td></tr></table>", "=heading=\n|table|\n")
|
498
|
-
tc("<h1>heading</h1><table><tr><td>table</td></tr></table>", "=heading=\n\n|table|\n")
|
499
|
-
end
|
500
|
-
|
501
|
-
def test_following_paragraph
|
502
|
-
# heading
|
503
|
-
tc("<p>par</p><h1>heading</h1>", "par\n=heading=")
|
504
|
-
tc("<p>par</p><h1>heading</h1>", "par\n\n=heading=")
|
505
|
-
# paragraph
|
506
|
-
tc("<p>par par</p>", "par\npar\n")
|
507
|
-
tc("<p>par</p><p>par</p>", "par\n\npar\n")
|
508
|
-
# unordered
|
509
|
-
tc("<p>par</p><ul><li>item</li></ul>", "par\n*item")
|
510
|
-
tc("<p>par</p><ul><li>item</li></ul>", "par\n\n*item")
|
511
|
-
# ordered
|
512
|
-
tc("<p>par</p><ol><li>item</li></ol>", "par\n#item\n")
|
513
|
-
tc("<p>par</p><ol><li>item</li></ol>", "par\n\n#item\n")
|
514
|
-
# horizontal
|
515
|
-
tc("<p>par</p><hr/>", "par\n----\n")
|
516
|
-
tc("<p>par</p><hr/>", "par\n\n----\n")
|
517
|
-
# nowiki
|
518
|
-
tc("<p>par</p><pre>nowiki</pre>", "par\n{{{\nnowiki\n}}}\n")
|
519
|
-
tc("<p>par</p><pre>nowiki</pre>", "par\n\n{{{\nnowiki\n}}}\n")
|
520
|
-
# table
|
521
|
-
tc("<p>par</p><table><tr><td>table</td></tr></table>", "par\n|table|\n")
|
522
|
-
tc("<p>par</p><table><tr><td>table</td></tr></table>", "par\n\n|table|\n")
|
523
|
-
end
|
524
|
-
|
525
|
-
def test_following_unordered_list
|
526
|
-
# heading
|
527
|
-
tc("<ul><li>item</li></ul><h1>heading</h1>", "*item\n=heading=")
|
528
|
-
tc("<ul><li>item</li></ul><h1>heading</h1>", "*item\n\n=heading=")
|
529
|
-
# paragraph
|
530
|
-
tc("<ul><li>item par</li></ul>", "*item\npar\n") # items may span multiple lines
|
531
|
-
tc("<ul><li>item</li></ul><p>par</p>", "*item\n\npar\n")
|
532
|
-
# unordered
|
533
|
-
tc("<ul><li>item</li><li>item</li></ul>", "*item\n*item\n")
|
534
|
-
tc("<ul><li>item</li></ul><ul><li>item</li></ul>", "*item\n\n*item\n")
|
535
|
-
# ordered
|
536
|
-
tc("<ul><li>item</li></ul><ol><li>item</li></ol>", "*item\n#item\n")
|
537
|
-
tc("<ul><li>item</li></ul><ol><li>item</li></ol>", "*item\n\n#item\n")
|
538
|
-
# horizontal rule
|
539
|
-
tc("<ul><li>item</li></ul><hr/>", "*item\n----\n")
|
540
|
-
tc("<ul><li>item</li></ul><hr/>", "*item\n\n----\n")
|
541
|
-
# nowiki
|
542
|
-
tc("<ul><li>item</li></ul><pre>nowiki</pre>", "*item\n{{{\nnowiki\n}}}\n")
|
543
|
-
tc("<ul><li>item</li></ul><pre>nowiki</pre>", "*item\n\n{{{\nnowiki\n}}}\n")
|
544
|
-
# table
|
545
|
-
tc("<ul><li>item</li></ul><table><tr><td>table</td></tr></table>", "*item\n|table|\n")
|
546
|
-
tc("<ul><li>item</li></ul><table><tr><td>table</td></tr></table>", "*item\n\n|table|\n")
|
547
|
-
end
|
548
|
-
|
549
|
-
def test_following_ordered_list
|
550
|
-
# heading
|
551
|
-
tc("<ol><li>item</li></ol><h1>heading</h1>", "#item\n=heading=")
|
552
|
-
tc("<ol><li>item</li></ol><h1>heading</h1>", "#item\n\n=heading=")
|
553
|
-
# paragraph
|
554
|
-
tc("<ol><li>item par</li></ol>", "#item\npar\n") # items may span multiple lines
|
555
|
-
tc("<ol><li>item</li></ol><p>par</p>", "#item\n\npar\n")
|
556
|
-
# unordered
|
557
|
-
tc("<ol><li>item</li></ol><ul><li>item</li></ul>", "#item\n*item\n")
|
558
|
-
tc("<ol><li>item</li></ol><ul><li>item</li></ul>", "#item\n\n*item\n")
|
559
|
-
# ordered
|
560
|
-
tc("<ol><li>item</li><li>item</li></ol>", "#item\n#item\n")
|
561
|
-
tc("<ol><li>item</li></ol><ol><li>item</li></ol>", "#item\n\n#item\n")
|
562
|
-
# horizontal role
|
563
|
-
tc("<ol><li>item</li></ol><hr/>", "#item\n----\n")
|
564
|
-
tc("<ol><li>item</li></ol><hr/>", "#item\n\n----\n")
|
565
|
-
# nowiki
|
566
|
-
tc("<ol><li>item</li></ol><pre>nowiki</pre>", "#item\n{{{\nnowiki\n}}}\n")
|
567
|
-
tc("<ol><li>item</li></ol><pre>nowiki</pre>", "#item\n\n{{{\nnowiki\n}}}\n")
|
568
|
-
# table
|
569
|
-
tc("<ol><li>item</li></ol><table><tr><td>table</td></tr></table>", "#item\n|table|\n")
|
570
|
-
tc("<ol><li>item</li></ol><table><tr><td>table</td></tr></table>", "#item\n\n|table|\n")
|
571
|
-
end
|
572
|
-
|
573
|
-
def test_following_horizontal_rule
|
574
|
-
# heading
|
575
|
-
tc("<hr/><h1>heading</h1>", "----\n=heading=")
|
576
|
-
tc("<hr/><h1>heading</h1>", "----\n\n=heading=")
|
577
|
-
# paragraph
|
578
|
-
tc("<hr/><p>par</p>", "----\npar\n")
|
579
|
-
tc("<hr/><p>par</p>", "----\n\npar\n")
|
580
|
-
# unordered
|
581
|
-
tc("<hr/><ul><li>item</li></ul>", "----\n*item")
|
582
|
-
tc("<hr/><ul><li>item</li></ul>", "----\n*item")
|
583
|
-
# ordered
|
584
|
-
tc("<hr/><ol><li>item</li></ol>", "----\n#item")
|
585
|
-
tc("<hr/><ol><li>item</li></ol>", "----\n#item")
|
586
|
-
# horizontal
|
587
|
-
tc("<hr/><hr/>", "----\n----\n")
|
588
|
-
tc("<hr/><hr/>", "----\n\n----\n")
|
589
|
-
# nowiki
|
590
|
-
tc("<hr/><pre>nowiki</pre>", "----\n{{{\nnowiki\n}}}\n")
|
591
|
-
tc("<hr/><pre>nowiki</pre>", "----\n\n{{{\nnowiki\n}}}\n")
|
592
|
-
# table
|
593
|
-
tc("<hr/><table><tr><td>table</td></tr></table>", "----\n|table|\n")
|
594
|
-
tc("<hr/><table><tr><td>table</td></tr></table>", "----\n\n|table|\n")
|
595
|
-
end
|
596
|
-
|
597
|
-
def test_following_nowiki_block
|
598
|
-
# heading
|
599
|
-
tc("<pre>nowiki</pre><h1>heading</h1>", "{{{\nnowiki\n}}}\n=heading=")
|
600
|
-
tc("<pre>nowiki</pre><h1>heading</h1>", "{{{\nnowiki\n}}}\n\n=heading=")
|
601
|
-
# paragraph
|
602
|
-
tc("<pre>nowiki</pre><p>par</p>", "{{{\nnowiki\n}}}\npar")
|
603
|
-
tc("<pre>nowiki</pre><p>par</p>", "{{{\nnowiki\n}}}\n\npar")
|
604
|
-
# unordered
|
605
|
-
tc("<pre>nowiki</pre><ul><li>item</li></ul>", "{{{\nnowiki\n}}}\n*item\n")
|
606
|
-
tc("<pre>nowiki</pre><ul><li>item</li></ul>", "{{{\nnowiki\n}}}\n\n*item\n")
|
607
|
-
# ordered
|
608
|
-
tc("<pre>nowiki</pre><ol><li>item</li></ol>", "{{{\nnowiki\n}}}\n#item\n")
|
609
|
-
tc("<pre>nowiki</pre><ol><li>item</li></ol>", "{{{\nnowiki\n}}}\n\n#item\n")
|
610
|
-
# horizontal
|
611
|
-
tc("<pre>nowiki</pre><hr/>", "{{{\nnowiki\n}}}\n----\n")
|
612
|
-
tc("<pre>nowiki</pre><hr/>", "{{{\nnowiki\n}}}\n\n----\n")
|
613
|
-
# nowiki
|
614
|
-
tc("<pre>nowiki</pre><pre>nowiki</pre>", "{{{\nnowiki\n}}}\n{{{\nnowiki\n}}}\n")
|
615
|
-
tc("<pre>nowiki</pre><pre>nowiki</pre>", "{{{\nnowiki\n}}}\n\n{{{\nnowiki\n}}}\n")
|
616
|
-
# table
|
617
|
-
tc("<pre>nowiki</pre><table><tr><td>table</td></tr></table>", "{{{\nnowiki\n}}}\n|table|\n")
|
618
|
-
tc("<pre>nowiki</pre><table><tr><td>table</td></tr></table>", "{{{\nnowiki\n}}}\n\n|table|\n")
|
619
|
-
end
|
620
|
-
|
621
|
-
def test_image
|
622
|
-
tc("<p><img src=\"image.jpg\"/></p>", "{{image.jpg}}")
|
623
|
-
tc("<p><img src=\"image.jpg\" alt=\"tag\"/></p>", "{{image.jpg|tag}}")
|
624
|
-
tc("<p><img src=\"http://example.org/image.jpg\"/></p>", "{{http://example.org/image.jpg}}")
|
625
|
-
end
|
626
|
-
|
627
|
-
def test_bold_combo
|
628
|
-
tc("<p><strong>bold and</strong></p><table><tr><td>table</td></tr></table><p>end<strong></strong></p>",
|
629
|
-
"**bold and\n|table|\nend**")
|
630
|
-
end
|
631
|
-
end
|