trac-wiki 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/trac_wiki/parser.rb +203 -91
- data/lib/trac_wiki/version.rb +1 -1
- data/test/parser_test.rb +150 -94
- metadata +1 -1
data/lib/trac_wiki/parser.rb
CHANGED
@@ -3,7 +3,7 @@ require 'uri'
|
|
3
3
|
|
4
4
|
# :main: TracWiki
|
5
5
|
|
6
|
-
# The
|
6
|
+
# The TracWiki parses and translates Trac formatted text into
|
7
7
|
# XHTML. Creole is a lightweight markup syntax similar to what many
|
8
8
|
# WikiWikiWebs use. Example syntax:
|
9
9
|
#
|
@@ -11,11 +11,11 @@ require 'uri'
|
|
11
11
|
# == Heading 2 ==
|
12
12
|
# === Heading 3 ===
|
13
13
|
# **Bold text**
|
14
|
-
#
|
14
|
+
# ''Italic text''
|
15
15
|
# [[Links]]
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
16
|
+
# ||=Table||=Heading||
|
17
|
+
# || Table|| Cells ||
|
18
|
+
# [[Image(image.png)]]
|
19
19
|
#
|
20
20
|
# The simplest interface is TracWiki.render. The default handling of
|
21
21
|
# links allow explicit local links using the [[link]] syntax. External
|
@@ -74,6 +74,7 @@ module TracWiki
|
|
74
74
|
@out = ''
|
75
75
|
@p = false
|
76
76
|
@stack = []
|
77
|
+
@stacki = []
|
77
78
|
parse_block(@text)
|
78
79
|
@out
|
79
80
|
end
|
@@ -92,13 +93,27 @@ module TracWiki
|
|
92
93
|
CGI::escape(string)
|
93
94
|
end
|
94
95
|
|
95
|
-
def start_tag(tag)
|
96
|
+
def start_tag(tag, args = '', lindent = nil)
|
97
|
+
lindent = @stacki.last || -1 if lindent.nil?
|
98
|
+
|
96
99
|
@stack.push(tag)
|
97
|
-
@
|
100
|
+
@stacki.push(lindent)
|
101
|
+
|
102
|
+
if tag == 'strongem'
|
103
|
+
@out << '<strong><em>'
|
104
|
+
else
|
105
|
+
@out << '<' << tag << args << '>'
|
106
|
+
end
|
98
107
|
end
|
99
108
|
|
100
109
|
def end_tag
|
101
|
-
|
110
|
+
tag = @stack.pop
|
111
|
+
tagi = @stacki.pop
|
112
|
+
if tag == 'strongem'
|
113
|
+
@out << '</em></strong>'
|
114
|
+
else
|
115
|
+
@out << "</#{tag}>"
|
116
|
+
end
|
102
117
|
end
|
103
118
|
|
104
119
|
def toggle_tag(tag, match)
|
@@ -185,11 +200,11 @@ module TracWiki
|
|
185
200
|
# method can be overridden to generate custom
|
186
201
|
# markup, for example to add html additional attributes or
|
187
202
|
# to put divs around the imgs.
|
188
|
-
def make_image(uri, alt)
|
203
|
+
def make_image(uri, alt='')
|
189
204
|
if alt
|
190
|
-
|
205
|
+
"<img src='" << escape_html(uri) << "' alt='" << escape_html(alt) << "'/>"
|
191
206
|
else
|
192
|
-
|
207
|
+
"<img src='" << escape_html(uri) << "'/>"
|
193
208
|
end
|
194
209
|
end
|
195
210
|
|
@@ -209,6 +224,7 @@ module TracWiki
|
|
209
224
|
def parse_inline(str)
|
210
225
|
until str.empty?
|
211
226
|
case str
|
227
|
+
# raw url
|
212
228
|
when /\A(\~)?((https?|ftps?):\/\/\S+?)(?=([\,.?!:;"'\)]+)?(\s|$))/
|
213
229
|
str = $'
|
214
230
|
if $1
|
@@ -220,26 +236,44 @@ module TracWiki
|
|
220
236
|
@out << escape_html($&)
|
221
237
|
end
|
222
238
|
end
|
239
|
+
# [[Image(pic.jpg|tag)]]
|
240
|
+
when /\A\[\[Image\(([^|].*?)(\|(.*?))?\)\]\]/ # image
|
241
|
+
str = $'
|
242
|
+
@out << make_image($1, $3)
|
243
|
+
# [[link]]
|
223
244
|
when /\A\[\[\s*([^|]*?)\s*(\|\s*(.*?))?\s*\]\]/m
|
224
245
|
str = $'
|
225
|
-
link, content = $1, $3
|
226
|
-
|
227
|
-
@out << '<a href="' << escape_html(uri) << '">'
|
228
|
-
if content
|
229
|
-
until content.empty?
|
230
|
-
content = parse_inline_tag(content)
|
231
|
-
end
|
232
|
-
else
|
233
|
-
@out << escape_html(link)
|
234
|
-
end
|
235
|
-
@out << '</a>'
|
236
|
-
else
|
237
|
-
@out << escape_html($&)
|
238
|
-
end
|
246
|
+
link, content, whole= $1, $3, $&
|
247
|
+
make_link(link, content, whole)
|
239
248
|
else
|
240
249
|
str = parse_inline_tag(str)
|
241
250
|
end
|
251
|
+
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
def make_link(link, content, whole)
|
256
|
+
uri = make_explicit_link(link)
|
257
|
+
# specail "link" [[BR]]:
|
258
|
+
if link =~ /br/i
|
259
|
+
@out << '<br/>'
|
260
|
+
return
|
261
|
+
end
|
262
|
+
if not uri
|
263
|
+
@out << escape_html(whole)
|
264
|
+
return
|
265
|
+
end
|
266
|
+
|
267
|
+
make_explicit_link(link)
|
268
|
+
@out << '<a href="' << escape_html(uri) << '">'
|
269
|
+
if content
|
270
|
+
until content.empty?
|
271
|
+
content = parse_inline_tag(content)
|
272
|
+
end
|
273
|
+
else
|
274
|
+
@out << escape_html(link)
|
242
275
|
end
|
276
|
+
@out << '</a>'
|
243
277
|
end
|
244
278
|
|
245
279
|
def parse_inline_tag(str)
|
@@ -248,21 +282,27 @@ module TracWiki
|
|
248
282
|
@out << '<tt>' << escape_html($1) << '</tt>'
|
249
283
|
when /\A`(.*?)`/ # inline pre (tt)
|
250
284
|
@out << '<tt>' << escape_html($1) << '</tt>'
|
251
|
-
when /\A\
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
285
|
+
# when /\A\[\[Image\(([^|].*?)(\|(.*?))?\)\]\]/ # image
|
286
|
+
# @out << make_image($1, $3)
|
287
|
+
|
288
|
+
# when /\A\{\{\s*(.*?)\s*(\|\s*(.*?)\s*)?\}\}/
|
289
|
+
# if uri = make_image_link($1)
|
290
|
+
# @out << make_image(uri, $3)
|
291
|
+
# else
|
292
|
+
# @out << escape_html($&)
|
293
|
+
# end # link
|
294
|
+
|
257
295
|
when /\A([:alpha:]|[:digit:])+/
|
258
296
|
@out << $& # word
|
259
297
|
when /\A\s+/
|
260
298
|
@out << ' ' if @out[-1] != ?\s # spaces
|
261
|
-
when /\A
|
299
|
+
when /\A'''''/
|
300
|
+
toggle_tag 'strongem', $& # bolditallic
|
301
|
+
when /\A\*\*/, /\A'''/
|
262
302
|
toggle_tag 'strong', $& # bold
|
263
|
-
when /\A''
|
303
|
+
when /\A''/, /\A\/\//
|
264
304
|
toggle_tag 'em', $& # italic
|
265
|
-
when /\A
|
305
|
+
when /\A\\\\/, /\A\[\[br\]\]/i
|
266
306
|
@out << '<br/>' # newline
|
267
307
|
when /\A__/
|
268
308
|
toggle_tag 'u', $& # underline
|
@@ -270,7 +310,7 @@ module TracWiki
|
|
270
310
|
toggle_tag 'del', $& # delete
|
271
311
|
# when /\A\+\+/
|
272
312
|
# toggle_tag 'ins', $& # insert
|
273
|
-
when /\A
|
313
|
+
when /\A\^/
|
274
314
|
toggle_tag 'sup', $& # ^{}
|
275
315
|
when /\A,,/
|
276
316
|
toggle_tag 'sub', $& # _{}
|
@@ -287,35 +327,106 @@ module TracWiki
|
|
287
327
|
end
|
288
328
|
|
289
329
|
def parse_table_row(str)
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
@out << ('<' + tag + style + '>' )
|
306
|
-
parse_inline(txt.strip) if txt
|
307
|
-
end_tag while @stack.last != 'table'
|
308
|
-
@out << ('</' + tag + '>')
|
330
|
+
start_tag('tr') if !@stack.include?('tr')
|
331
|
+
colspan = 1
|
332
|
+
print_tr = true
|
333
|
+
last_tail = ''
|
334
|
+
last_txt = ''
|
335
|
+
str.scan(/(=?)(\s*)(.*?)\1?($ | \|\|\\\s*$ | \|\| )/x) do
|
336
|
+
tdth = $1.empty? ? 'td' : 'th'
|
337
|
+
le, txt, tail = $2.size, $3, $4
|
338
|
+
|
339
|
+
# do not end row, continue on next line
|
340
|
+
print_tr = false if tail =~ /^\|\|\\/
|
341
|
+
|
342
|
+
if txt.empty? && le == 0
|
343
|
+
colspan += 1
|
344
|
+
next
|
309
345
|
end
|
346
|
+
|
347
|
+
style = ''
|
348
|
+
if txt =~ /\S(\s*)$/
|
349
|
+
ri = $1.size
|
350
|
+
ri += 100 if tail.empty? # do not right when last || omnited
|
351
|
+
style = " style='text-align:right'" if ri == 0 && le >= 1
|
352
|
+
style = " style='text-align:center'" if le >= 2 && ri >= 2
|
353
|
+
#print "le#{le} ri#{ri} st:#{style}\n"
|
354
|
+
end
|
355
|
+
|
356
|
+
colspan_txt = colspan > 1 ? " colspan='#{colspan}'" : ''
|
357
|
+
start_tag(tdth, style + colspan_txt);
|
358
|
+
colspan = 1
|
359
|
+
|
360
|
+
parse_inline(txt.strip) if txt
|
361
|
+
end_tag while @stack.last != 'tr'
|
362
|
+
end
|
363
|
+
if print_tr
|
364
|
+
end_tag
|
310
365
|
end
|
311
|
-
@out << '</tr>'
|
312
366
|
end
|
313
367
|
|
314
368
|
def make_nowikiblock(input)
|
315
369
|
input.gsub(/^ (?=\}\}\})/, '')
|
316
370
|
end
|
317
371
|
|
318
|
-
def
|
372
|
+
def parse_li_line(spc_size, bullet, text)
|
373
|
+
|
374
|
+
while !@stacki.empty? && @stacki.last > spc_size
|
375
|
+
end_tag
|
376
|
+
end
|
377
|
+
|
378
|
+
if @stack.include?('li')
|
379
|
+
while @stack.last != 'li'
|
380
|
+
end_tag
|
381
|
+
end
|
382
|
+
|
383
|
+
# end list if type differ
|
384
|
+
# @stack.last is now ul or li
|
385
|
+
if @stacki.last == spc_size
|
386
|
+
end_tag # li
|
387
|
+
ulol_last = @stack.last
|
388
|
+
ulol_now = bullet =~ /[*-]/ ? 'ul' : 'ol'
|
389
|
+
if ulol_last != ulol_now
|
390
|
+
end_tag # ol | ul
|
391
|
+
end
|
392
|
+
end
|
393
|
+
else
|
394
|
+
end_paragraph
|
395
|
+
end
|
396
|
+
|
397
|
+
if @stacki.empty? || @stacki.last < spc_size
|
398
|
+
bullet.gsub!(/\.$/,'')
|
399
|
+
ulol = bullet =~ /[-*]/ ? 'ul' : 'ol';
|
400
|
+
attr = ""
|
401
|
+
attr = " type='i'" if bullet =~ /i/i;
|
402
|
+
attr = " type='a'" if bullet =~ /a/i;
|
403
|
+
|
404
|
+
if bullet =~ /^\d+$/ && bullet != '1'
|
405
|
+
attr += " start='#{bullet}'"
|
406
|
+
end
|
407
|
+
start_tag(ulol, attr, spc_size)
|
408
|
+
end
|
409
|
+
|
410
|
+
start_tag('li')
|
411
|
+
parse_inline(text)
|
412
|
+
|
413
|
+
end
|
414
|
+
|
415
|
+
def blockquote_level_to(level)
|
416
|
+
cur_level = @stack.count('blockquote')
|
417
|
+
if cur_level == level
|
418
|
+
@out << ' '
|
419
|
+
return
|
420
|
+
end
|
421
|
+
while cur_level < level
|
422
|
+
cur_level += 1
|
423
|
+
start_tag('blockquote')
|
424
|
+
end
|
425
|
+
while cur_level > level
|
426
|
+
cur_level -= 1 if @stack.last == 'blockquote'
|
427
|
+
end_tag
|
428
|
+
end
|
429
|
+
end
|
319
430
|
|
320
431
|
def parse_block(str)
|
321
432
|
until str.empty?
|
@@ -339,58 +450,59 @@ module TracWiki
|
|
339
450
|
@out << make_headline(level, $2)
|
340
451
|
|
341
452
|
# table row
|
342
|
-
when /\A[ \t]
|
453
|
+
when /\A[ \t]*\|\|(.*)$(\r?\n)?/
|
343
454
|
if !@stack.include?('table')
|
344
455
|
end_paragraph
|
345
456
|
start_tag('table')
|
346
457
|
end
|
347
|
-
parse_table_row(
|
458
|
+
parse_table_row($1)
|
348
459
|
|
349
460
|
# empty line
|
350
461
|
when /\A\s*$(\r?\n)?/
|
351
462
|
end_paragraph
|
463
|
+
when /\A([\w\s]*)::\s*/
|
464
|
+
term = $1
|
465
|
+
start_tag('dl')
|
466
|
+
start_tag('dt')
|
467
|
+
@out << escape_html(term)
|
468
|
+
end_tag
|
469
|
+
start_tag('dd')
|
352
470
|
|
353
471
|
# li
|
354
|
-
when /\A(\s*([
|
355
|
-
|
356
|
-
tag = (bullet[0,1] == '*' ? 'ul' : 'ol')
|
357
|
-
if bullet[0,1] == '#' || bullet.size != 2 || @stack.find {|x| ulol?(x) }
|
358
|
-
count = @stack.select { |x| ulol?(x) }.size
|
359
|
-
|
360
|
-
while !@stack.empty? && count > bullet.size
|
361
|
-
count -= 1 if ulol?(@stack.last)
|
362
|
-
end_tag
|
363
|
-
end
|
472
|
+
when /\A(\s*)([*-]|[aAIi\d]\.)\s+(.*?)$(\r?\n)?/
|
473
|
+
parse_li_line($1.size, $2, $3)
|
364
474
|
|
365
|
-
|
475
|
+
when /\A(>[>\s]*)(.*?)$(\r?\n)?/
|
476
|
+
# citation
|
477
|
+
level, quote = $1.count('>'), $2
|
366
478
|
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
end_tag
|
371
|
-
count -= 1
|
372
|
-
end
|
373
|
-
end
|
479
|
+
start_paragraph if !@stack.include? 'p'
|
480
|
+
blockquote_level_to(level)
|
481
|
+
parse_inline(quote.strip)
|
374
482
|
|
375
|
-
while count < bullet.size
|
376
|
-
start_tag tag
|
377
|
-
count += 1
|
378
|
-
start_tag 'li' if count < bullet.size
|
379
|
-
end
|
380
483
|
|
381
|
-
|
382
|
-
|
383
|
-
|
484
|
+
# ordinary line
|
485
|
+
when /\A(\s*)(\S+.*?)$(\r?\n)?/
|
486
|
+
spc_size, text = $1.size, $2
|
487
|
+
|
488
|
+
if @stack.include?('li') ||@stack.include?('dl')
|
489
|
+
|
490
|
+
# dl, li continuation
|
491
|
+
parse_inline(' ')
|
492
|
+
parse_inline(text)
|
493
|
+
|
494
|
+
elsif spc_size > 0
|
495
|
+
# quote continuation
|
496
|
+
start_paragraph if !@stack.include? 'p'
|
497
|
+
blockquote_level_to(1)
|
498
|
+
parse_inline(text)
|
499
|
+
|
384
500
|
else
|
501
|
+
# real ordinary line
|
385
502
|
start_paragraph
|
386
|
-
parse_inline(
|
503
|
+
parse_inline(text)
|
387
504
|
end
|
388
|
-
|
389
|
-
# ordinary line
|
390
|
-
when /\A([ \t]*\S+.*?)$(\r?\n)?/
|
391
|
-
start_paragraph
|
392
|
-
parse_inline($1)
|
393
|
-
else
|
505
|
+
else # case str
|
394
506
|
raise "Parse error at #{str[0,30].inspect}"
|
395
507
|
end
|
396
508
|
str = $'
|
data/lib/trac_wiki/version.rb
CHANGED
data/test/parser_test.rb
CHANGED
@@ -46,6 +46,24 @@ describe TracWiki::Parser do
|
|
46
46
|
tc "<p>This <strong>is bold</strong></p>", "This **is\nbold**"
|
47
47
|
end
|
48
48
|
|
49
|
+
it 'should parse bolditalic' do
|
50
|
+
tc '<p>This is <strong><em>bolditallic</em></strong>.</p>', "This is '''''bolditallic'''''."
|
51
|
+
tc '<p>This is <strong> <em>bolditallic</em> </strong>.</p>', "This is ''' ''bolditallic'' '''."
|
52
|
+
tc '<p>This is <em> <strong>bolditallic</strong> </em>.</p>', "This is '' '''bolditallic''' ''."
|
53
|
+
tc '<p>This is <strong>bold</strong>.</p>', "This is '''bold'''."
|
54
|
+
#fuj tc '<p>This is <strong><em>bolditallic</em></strong>.</p>', "This is **''bolditallic**''."
|
55
|
+
end
|
56
|
+
it 'should parse monospace' do
|
57
|
+
tc "<p>This is <tt>monospace</tt>.</p>", "This is {{{monospace}}}."
|
58
|
+
tc "<p>This is <tt>mon**o**space</tt>.</p>", "This is {{{mon**o**space}}}."
|
59
|
+
tc "<p>This is <tt>mon<o>space</tt>.</p>", "This is {{{mon<o>space}}}."
|
60
|
+
tc "<p>This is <tt>mon''o''space</tt>.</p>", "This is {{{mon''o''space}}}."
|
61
|
+
tc "<p>This is <tt>mon''o''space</tt>.</p>", "This is `mon''o''space`."
|
62
|
+
tc "<p>This is <tt>mon{{o}}space</tt>.</p>", "This is {{{mon{{o}}space}}}."
|
63
|
+
tc "<p>This is <tt>mon``o''space</tt>.</p>", "This is {{{mon``o''space}}}."
|
64
|
+
tc "<p>This is <tt>mon{{o}}space</tt>.</p>", "This is `mon{{o}}space`."
|
65
|
+
end
|
66
|
+
|
49
67
|
it 'should parse italic' do
|
50
68
|
# Italic can be used inside paragraphs
|
51
69
|
tc("<p>This <em>is</em> italic</p>",
|
@@ -156,7 +174,7 @@ describe TracWiki::Parser do
|
|
156
174
|
|
157
175
|
# WRNING: Parsing markup within a link is optional
|
158
176
|
tc "<p><a href=\"Weird+Stuff\"><strong>Weird</strong> <em>Stuff</em></a></p>", "[[Weird Stuff|**Weird** ''Stuff'']]"
|
159
|
-
tc("<p><a href=\"http://example.org/\"><img src
|
177
|
+
#tc("<p><a href=\"http://example.org/\"><img src='image.jpg'/></a></p>", "[[http://example.org/|{{image.jpg}}]]")
|
160
178
|
|
161
179
|
# Inside bold
|
162
180
|
tc "<p><strong><a href=\"link\">link</a></strong></p>", "**[[link]]**"
|
@@ -210,19 +228,35 @@ describe TracWiki::Parser do
|
|
210
228
|
it 'should parse linebreaks' do
|
211
229
|
# \\ (wiki-style) for line breaks.
|
212
230
|
tc "<p>This is the first line,<br/>and this is the second.</p>", "This is the first line,\\\\and this is the second."
|
231
|
+
tc "<p>This is the first line,<br/>and this is the second.</p>", "This is the first line,[[br]]and this is the second."
|
232
|
+
tc "<p>This is the first line,<br/>and this is the second.</p>", "This is the first line,[[Br]]and this is the second."
|
213
233
|
end
|
214
234
|
|
235
|
+
it 'should parse blockquote' do
|
236
|
+
tc "<p><blockquote>Monty Python</blockquote></p>", "> Monty Python\n"
|
237
|
+
tc "<p><blockquote>Monty Python q2</blockquote></p>", "> Monty Python\n> q2\n"
|
238
|
+
tc "<p><blockquote>Monty Python q2</blockquote></p>", "> Monty Python\n>q2\n"
|
239
|
+
tc "<p><blockquote>Monty Python <strong>q2</strong></blockquote></p>", "> Monty Python\n>**q2**\n"
|
240
|
+
tc "<p><blockquote>Monty Python<blockquote>q2</blockquote></blockquote></p>", "> Monty Python\n> > q2\n"
|
241
|
+
tc "<p><blockquote>Monty Python<blockquote>q2 q3</blockquote></blockquote></p>", "> Monty Python\n> > q2\n>>q3\n"
|
242
|
+
tc "<p><blockquote>Monty Python<blockquote><em>q2</em></blockquote>q1</blockquote></p>", ">Monty Python\n> > ''q2''\n>q1"
|
243
|
+
tc "<p><blockquote>Monty Python rules</blockquote></p>", " Monty Python\n rules\n"
|
244
|
+
end
|
245
|
+
it 'should parse definition list' do
|
246
|
+
# FIXME: trailing space
|
247
|
+
tc "<dl><dt>Monty Python</dt><dd> definition</dd></dl>", "Monty Python:: \n definition\n"
|
248
|
+
end
|
215
249
|
it 'should parse unordered_lists' do
|
216
250
|
# List items begin with a * at the beginning of a line.
|
217
251
|
# An item ends at the next *
|
218
|
-
|
252
|
+
|
253
|
+
tc "<ul><li>Item 1 next</li></ul>", "* Item 1\n next\n"
|
219
254
|
|
220
255
|
# Whitespace is optional before and after the *.
|
221
256
|
tc("<ul><li>Item 1</li><li>Item 2</li><li>Item 3</li></ul>",
|
222
|
-
" * Item 1\n*Item 2\n
|
257
|
+
" * Item 1\n * Item 2\n *\t\tItem 3\n")
|
223
258
|
|
224
259
|
# A space is required if if the list element starts with bold text.
|
225
|
-
tc("<ul><li><ul><li><ul><li>Item 1</li></ul></li></ul></li></ul>", "***Item 1")
|
226
260
|
tc("<ul><li><strong>Item 1</strong></li></ul>", "* **Item 1")
|
227
261
|
|
228
262
|
# An item ends at blank line
|
@@ -239,107 +273,110 @@ describe TracWiki::Parser do
|
|
239
273
|
|
240
274
|
# An item can span multiple lines
|
241
275
|
tc("<ul><li>The quick brown fox jumps over lazy dog.</li><li>Humpty Dumpty sat on a wall.</li></ul>",
|
242
|
-
"* The quick\nbrown fox\n\tjumps over\nlazy dog.\n*Humpty Dumpty\nsat\t\non a wall.")
|
276
|
+
"* The quick\nbrown fox\n\tjumps over\nlazy dog.\n* Humpty Dumpty\nsat\t\non a wall.")
|
243
277
|
|
244
278
|
# An item can contain line breaks
|
245
279
|
tc("<ul><li>The quick brown<br/>fox jumps over lazy dog.</li></ul>",
|
246
280
|
"* The quick brown\\\\fox jumps over lazy dog.")
|
247
281
|
|
248
282
|
# Nested
|
249
|
-
tc "<ul><li>Item 1<ul><li>Item 2</li></ul></li><li>Item 3</li></ul>", "* Item 1\n
|
283
|
+
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"
|
250
284
|
|
251
285
|
# Nested up to 5 levels
|
252
286
|
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>",
|
253
|
-
"*Item 1\n
|
287
|
+
"* Item 1\n * Item 2\n * Item 3\n * Item 4\n * Item 5\n")
|
288
|
+
|
289
|
+
tc("<ul><li>Item 1<ul><li>Item 2<ul><li>Item 3<ul><li>Item 4</li></ul></li></ul></li></ul></li><li>Item 5</li></ul>",
|
290
|
+
"* Item 1\n * Item 2\n * Item 3\n * Item 4\n* Item 5\n")
|
254
291
|
|
255
292
|
# ** immediatly following a list element will be treated as a nested unordered element.
|
256
293
|
tc("<ul><li>Hello, World!<ul><li>Not bold</li></ul></li></ul>",
|
257
|
-
"*Hello,\
|
294
|
+
"* Hello,\n World!\n * Not bold\n")
|
258
295
|
|
259
296
|
# ** immediatly following a list element will be treated as a nested unordered element.
|
260
297
|
tc("<ol><li>Hello, World!<ul><li>Not bold</li></ul></li></ol>",
|
261
|
-
"
|
298
|
+
"1. Hello,\n World!\n * Not bold\n")
|
262
299
|
|
263
300
|
# [...] otherwise it will be treated as the beginning of bold text.
|
264
301
|
tc("<ul><li>Hello, World!</li></ul><p><strong>Not bold</strong></p>",
|
265
|
-
"*Hello,\nWorld!\n\n**Not bold\n")
|
302
|
+
"* Hello,\nWorld!\n\n**Not bold\n")
|
266
303
|
end
|
267
304
|
|
268
305
|
it 'should parse ordered lists' do
|
269
306
|
# List items begin with a * at the beginning of a line.
|
270
307
|
# An item ends at the next *
|
271
|
-
tc "<ol><li>Item 1</li><li>Item 2</li><li>Item 3</li></ol>", "
|
308
|
+
tc "<ol><li>Item 1</li><li>Item 2</li><li>Item 3</li></ol>", "1. Item 1\n2. Item 2\n3. \t\tItem 3\n"
|
272
309
|
|
273
310
|
# Whitespace is optional before and after the #.
|
274
311
|
tc("<ol><li>Item 1</li><li>Item 2</li><li>Item 3</li></ol>",
|
275
|
-
"
|
312
|
+
"1. Item 1\n1. Item 2\n4.\t\tItem 3\n")
|
276
313
|
|
277
314
|
# A space is required if if the list element starts with bold text.
|
278
|
-
tc("<ol><li><ol><li><ol><li>Item 1</li></ol></li></ol></li></ol>", "###Item 1")
|
279
|
-
tc("<ol><li><strong>Item 1</strong></li></ol>", "
|
315
|
+
# tc("<ol><li><ol><li><ol><li>Item 1</li></ol></li></ol></li></ol>", "###Item 1")
|
316
|
+
tc("<ol><li><strong>Item 1</strong></li></ol>", "1. **Item 1")
|
280
317
|
|
281
318
|
# An item ends at blank line
|
282
|
-
tc("<ol><li>Item</li></ol><p>Par</p>", "
|
319
|
+
tc("<ol><li>Item</li></ol><p>Par</p>", "1. Item\n\nPar\n")
|
283
320
|
|
284
321
|
# An item ends at a heading
|
285
|
-
tc("<ol><li>Item</li></ol><h1>Heading</h1>", "
|
322
|
+
tc("<ol><li>Item</li></ol><h1>Heading</h1>", "1. Item\n= Heading =\n")
|
286
323
|
|
287
324
|
# An item ends at a table
|
288
|
-
tc("<ol><li>Item</li></ol><table><tr><td>Cell</td></tr></table>", "
|
325
|
+
tc("<ol><li>Item</li></ol><table><tr><td>Cell</td></tr></table>", "1. Item\n||Cell||\n")
|
289
326
|
|
290
327
|
# An item ends at a nowiki block
|
291
|
-
tc("<ol><li>Item</li></ol><pre>Code</pre>", "
|
328
|
+
tc("<ol><li>Item</li></ol><pre>Code</pre>", "1. Item\n{{{\nCode\n}}}\n")
|
292
329
|
|
293
330
|
# An item can span multiple lines
|
294
331
|
tc("<ol><li>The quick brown fox jumps over lazy dog.</li><li>Humpty Dumpty sat on a wall.</li></ol>",
|
295
|
-
"
|
332
|
+
"1. The quick\nbrown fox\n\tjumps over\nlazy dog.\n2. Humpty Dumpty\nsat\t\non a wall.")
|
296
333
|
|
297
334
|
# An item can contain line breaks
|
298
335
|
tc("<ol><li>The quick brown<br/>fox jumps over lazy dog.</li></ol>",
|
299
|
-
"
|
336
|
+
"1. The quick brown\\\\fox jumps over lazy dog.")
|
300
337
|
|
301
338
|
# Nested
|
302
|
-
tc "<ol><li>Item 1<ol><li>Item 2</li></ol></li><li>Item 3</li></ol>", "
|
339
|
+
tc "<ol><li>Item 1<ol><li>Item 2</li></ol></li><li>Item 3</li></ol>", "1. Item 1\n 1. Item 2\n2.\t\tItem 3\n"
|
303
340
|
|
304
341
|
# Nested up to 5 levels
|
305
342
|
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>",
|
306
|
-
"
|
343
|
+
"1. Item 1\n 1. Item 2\n 1. Item 3\n 1. Item 4\n 1. Item 5\n")
|
307
344
|
|
308
345
|
# The two-bullet rule only applies to **.
|
309
|
-
tc("<ol><li><ol><li>Item</li></ol></li></ol>", "##Item")
|
346
|
+
# tc("<ol><li><ol><li>Item</li></ol></li></ol>", "##Item")
|
310
347
|
end
|
311
348
|
|
312
349
|
it 'should parse ordered lists #2' do
|
313
|
-
tc "<ol><li>Item 1</li><li>Item 2</li><li>Item 3</li></ol>", "
|
350
|
+
tc "<ol><li>Item 1</li><li>Item 2</li><li>Item 3</li></ol>", "1. Item 1\n1. Item 2\n1.\t\tItem 3\n"
|
314
351
|
# Nested
|
315
|
-
tc "<ol><li>Item 1<ol><li>Item 2</li></ol></li><li>Item 3</li></ol>", "
|
352
|
+
tc "<ol><li>Item 1<ol><li>Item 2</li></ol></li><li>Item 3</li></ol>", "1. Item 1\n 1. Item 2\n1.\t\tItem 3\n"
|
316
353
|
# Multiline
|
317
|
-
tc "<ol><li>Item 1 on multiple lines</li></ol>", "
|
354
|
+
tc "<ol><li>Item 1 on multiple lines</li></ol>", "1. Item 1\non multiple lines"
|
318
355
|
end
|
319
356
|
|
320
357
|
it 'should parse ambiguious mixed lists' do
|
321
358
|
# ol following ul
|
322
|
-
tc("<ul><li>uitem</li></ul><ol><li>oitem</li></ol>", "*uitem\
|
359
|
+
tc("<ul><li>uitem</li></ul><ol><li>oitem</li></ol>", "* uitem\n1. oitem\n")
|
323
360
|
|
324
361
|
# ul following ol
|
325
|
-
tc("<ol><li>uitem</li></ol><ul><li>oitem</li></ul>", "
|
362
|
+
tc("<ol><li>uitem</li></ol><ul><li>oitem</li></ul>", "1. uitem\n* oitem\n")
|
326
363
|
|
327
364
|
# 2ol following ul
|
328
|
-
tc("<ul><li>uitem<ol><li>oitem</li></ol></li></ul>", "*uitem\n
|
365
|
+
tc("<ul><li>uitem<ol><li>oitem</li></ol></li></ul>", "* uitem\n 1. oitem\n")
|
329
366
|
|
330
367
|
# 2ul following ol
|
331
|
-
tc("<ol><li>uitem<ul><li>oitem</li></ul></li></ol>", "
|
368
|
+
tc("<ol><li>uitem<ul><li>oitem</li></ul></li></ol>", "1. uitem\n * oitem\n")
|
332
369
|
|
333
370
|
# 3ol following 3ul
|
334
|
-
tc("<ul><li><ul><li><ul><li>uitem</li></ul><ol><li>oitem</li></ol></li></ul></li></ul>", "***uitem\n###oitem\n")
|
371
|
+
# tc("<ul><li><ul><li><ul><li>uitem</li></ul><ol><li>oitem</li></ol></li></ul></li></ul>", "***uitem\n###oitem\n")
|
335
372
|
|
336
373
|
# 2ul following 2ol
|
337
|
-
tc("<ol><li><ol><li>uitem</li></ol><ul><li>oitem</li></ul></li></ol>", "##uitem\n**oitem\n")
|
374
|
+
# tc("<ol><li><ol><li>uitem</li></ol><ul><li>oitem</li></ul></li></ol>", "##uitem\n**oitem\n")
|
338
375
|
|
339
376
|
# ol following 2ol
|
340
|
-
tc("<ol><li><ol><li>oitem1</li></ol></li><li>oitem2</li></ol>", "##oitem1\n#oitem2\n")
|
377
|
+
# tc("<ol><li><ol><li>oitem1</li></ol></li><li>oitem2</li></ol>", "##oitem1\n#oitem2\n")
|
341
378
|
# ul following 2ol
|
342
|
-
tc("<ol><li><ol><li>oitem1</li></ol></li></ol><ul><li>oitem2</li></ul>", "##oitem1\n*oitem2\n")
|
379
|
+
# tc("<ol><li><ol><li>oitem1</li></ol></li></ol><ul><li>oitem2</li></ul>", "##oitem1\n*oitem2\n")
|
343
380
|
end
|
344
381
|
|
345
382
|
it 'should parse ambiguious italics and url' do
|
@@ -358,12 +395,13 @@ describe TracWiki::Parser do
|
|
358
395
|
|
359
396
|
it 'should parse ambiguious bold and lists' do
|
360
397
|
tc "<p><strong> bold text </strong></p>", "** bold text **"
|
361
|
-
tc "<p
|
398
|
+
tc "<p><blockquote><strong> bold text </strong></blockquote></p>", " ** bold text **"
|
362
399
|
end
|
363
400
|
|
364
401
|
it 'should parse nowiki' do
|
365
402
|
# ... works as block
|
366
403
|
tc "<pre>Hello</pre>", "{{{\nHello\n}}}\n"
|
404
|
+
tc "<p><tt>{{{-}}}</tt></p>", "`{{{-}}}`\n"
|
367
405
|
|
368
406
|
# ... works inline
|
369
407
|
tc "<p>Hello <tt>world</tt>.</p>", "Hello {{{world}}}."
|
@@ -373,8 +411,8 @@ describe TracWiki::Parser do
|
|
373
411
|
tc "<pre>**Hello**</pre>", "{{{\n**Hello**\n}}}\n"
|
374
412
|
|
375
413
|
# Leading whitespaces are not permitted
|
376
|
-
tc("<p>
|
377
|
-
tc("<p>{{{ Hello
|
414
|
+
# tc("<p>{{{ Hello }}}</p>", " {{{\nHello\n}}}")
|
415
|
+
tc("<p>{{{ Hello<blockquote>}}}</blockquote></p>", "{{{\nHello\n }}}")
|
378
416
|
|
379
417
|
# Assumed: Should preserve whitespace
|
380
418
|
tc("<pre> \t Hello, \t \n \t World \t </pre>",
|
@@ -395,7 +433,8 @@ describe TracWiki::Parser do
|
|
395
433
|
tc("<p><b>not bold</b></p>", "<b>not bold</b>")
|
396
434
|
|
397
435
|
# Image tags should be escape
|
398
|
-
tc("<p><img src
|
436
|
+
tc("<p><img src='image.jpg'/></p>", "[[Image(image.jpg)]]")
|
437
|
+
tc("<p><img src='image.jpg' alt='"tag"'/></p>", "[[Image(image.jpg|\"tag\")]]")
|
399
438
|
|
400
439
|
# Malicious links should not be converted.
|
401
440
|
tc("<p><a href=\"javascript%3Aalert%28%22Boo%21%22%29\">Click</a></p>", "[[javascript:alert(\"Boo!\")|Click]]")
|
@@ -407,7 +446,9 @@ describe TracWiki::Parser do
|
|
407
446
|
tc "<p>* Not Bullet</p>", "!* Not Bullet"
|
408
447
|
# Following char is not a blank (space or line feed)
|
409
448
|
tc "<p>Hello ~ world</p>", "Hello ~ world\n"
|
410
|
-
tc "<p>Hello
|
449
|
+
tc "<p>Hello ! world</p>", "Hello ! world\n"
|
450
|
+
tc "<p>Hello ! world</p>", "Hello ! world\n"
|
451
|
+
tc "<p>Hello ! world</p>", "Hello !\nworld\n"
|
411
452
|
# Not escaping inside URLs
|
412
453
|
tc "<p><a href=\"http://example.org/~user/\">http://example.org/~user/</a></p>", "http://example.org/~user/"
|
413
454
|
|
@@ -430,11 +471,22 @@ describe TracWiki::Parser do
|
|
430
471
|
tc "<p>---- foo</p>", "---- foo\n"
|
431
472
|
|
432
473
|
# [...] no whitespace is allowed between them
|
433
|
-
tc "<p
|
434
|
-
tc "<p
|
474
|
+
tc "<p>-- -- </p>", "-- -- "
|
475
|
+
tc "<p>-- -- </p>", "--\t-- "
|
435
476
|
end
|
436
477
|
|
437
478
|
it 'should parse table' do
|
479
|
+
tc "<table><tr><td>Hello</td><td>World!</td></tr></table>", "||Hello||World!||"
|
480
|
+
tc "<table><tr><td>Hello</td><td>World!</td></tr></table>", "||Hello||\\\n||World!||"
|
481
|
+
tc "<table><tr><td>He</td><td>llo</td><td>World!</td></tr></table>", "||He||llo||\\\n||World!||"
|
482
|
+
tc "<table><tr><td>Hello</td><td colspan='2'>World!</td></tr></table>", "||Hello||||World!||"
|
483
|
+
tc "<table><tr><td>Hello</td><td colspan='2'>kuk</td><td>World!</td></tr></table>", "||Hello||||kuk||\\\n||World!||"
|
484
|
+
tc "<table><tr><td>1</td><td>2</td><td>3</td></tr><tr><td colspan='2'>1-2</td><td>3</td></tr><tr><td>1</td><td colspan='2'>2-3</td></tr><tr><td colspan='3'>1-2-3</td></tr></table>", "|| 1 || 2 || 3 ||\n|||| 1-2 || 3 ||\n|| 1 |||| 2-3 ||\n|||||| 1-2-3 ||\n"
|
485
|
+
|
486
|
+
tc "<table><tr><td>table</td><td style='text-align:center'>center</td></tr></table>", "||table|| center ||"
|
487
|
+
tc "<table><tr><td>table</td><td style='text-align:right'>right</td></tr></table>", "||table|| right||"
|
488
|
+
tc "<table><tr><td>table</td><td style='text-align:center'>center</td><td style='text-align:right'>right</td></tr></table>", "||table|| center || right||"
|
489
|
+
|
438
490
|
tc "<table><tr><td>Hello, World!</td></tr></table>", "||Hello, World!||"
|
439
491
|
tc "<table><tr><td style='text-align:right'>Hello, Right World!</td></tr></table>", "|| Hello, Right World!||"
|
440
492
|
tc "<table><tr><th style='text-align:right'>Hello, Right World!</th></tr></table>", "||= Hello, Right World!=||"
|
@@ -457,7 +509,7 @@ describe TracWiki::Parser do
|
|
457
509
|
# Equal sign after pipe make a header
|
458
510
|
tc "<table><tr><th>Header</th></tr></table>", "||=Header=||"
|
459
511
|
|
460
|
-
tc "<table><tr><td>c1</td><td><a href=\"Link\">Link text</a></td><td><img src
|
512
|
+
tc "<table><tr><td>c1</td><td><a href=\"Link\">Link text</a></td><td><img src='Image'/></td></tr></table>", "||c1||[[Link|Link text]]||[[Image(Image)]]||"
|
461
513
|
end
|
462
514
|
|
463
515
|
it 'should parse following table' do
|
@@ -468,11 +520,11 @@ describe TracWiki::Parser do
|
|
468
520
|
tc("<table><tr><td>table</td></tr></table><p>par</p>", "||table||\npar\n")
|
469
521
|
tc("<table><tr><td>table</td></tr></table><p>par</p>", "||table||\n\npar\n")
|
470
522
|
# table followed by unordered list
|
471
|
-
tc("<table><tr><td>table</td></tr></table><ul><li>item</li></ul>", "||table||\n*item\n")
|
472
|
-
tc("<table><tr><td>table</td></tr></table><ul><li>item</li></ul>", "||table||\n\n*item\n")
|
523
|
+
tc("<table><tr><td>table</td></tr></table><ul><li>item</li></ul>", "||table||\n* item\n")
|
524
|
+
tc("<table><tr><td>table</td></tr></table><ul><li>item</li></ul>", "||table||\n\n* item\n")
|
473
525
|
# table followed by ordered list
|
474
|
-
tc("<table><tr><td>table</td></tr></table><ol><li>item</li></ol>", "||table||\
|
475
|
-
tc("<table><tr><td>table</td></tr></table><ol><li>item</li></ol>", "||table||\n\
|
526
|
+
tc("<table><tr><td>table</td></tr></table><ol><li>item</li></ol>", "||table||\n1. item\n")
|
527
|
+
tc("<table><tr><td>table</td></tr></table><ol><li>item</li></ol>", "||table||\n\n1. item\n")
|
476
528
|
# table followed by horizontal rule
|
477
529
|
tc("<table><tr><td>table</td></tr></table><hr/>", "||table||\n----\n")
|
478
530
|
tc("<table><tr><td>table</td></tr></table><hr/>", "||table||\n\n----\n")
|
@@ -492,11 +544,11 @@ describe TracWiki::Parser do
|
|
492
544
|
tc("<h1>heading</h1><p>par</p>", "=heading=\npar\n")
|
493
545
|
tc("<h1>heading</h1><p>par</p>", "=heading=\n\npar\n")
|
494
546
|
# unordered list
|
495
|
-
tc("<h1>heading</h1><ul><li>item</li></ul>", "=heading=\n*item\n")
|
496
|
-
tc("<h1>heading</h1><ul><li>item</li></ul>", "=heading=\n\n*item\n")
|
547
|
+
tc("<h1>heading</h1><ul><li>item</li></ul>", "=heading=\n* item\n")
|
548
|
+
tc("<h1>heading</h1><ul><li>item</li></ul>", "=heading=\n\n* item\n")
|
497
549
|
# ordered list
|
498
|
-
tc("<h1>heading</h1><ol><li>item</li></ol>", "=heading=\
|
499
|
-
tc("<h1>heading</h1><ol><li>item</li></ol>", "=heading=\n\
|
550
|
+
tc("<h1>heading</h1><ol><li>item</li></ol>", "=heading=\n1. item\n")
|
551
|
+
tc("<h1>heading</h1><ol><li>item</li></ol>", "=heading=\n\n1. item\n")
|
500
552
|
# horizontal rule
|
501
553
|
tc("<h1>heading</h1><hr/>", "=heading=\n----\n")
|
502
554
|
tc("<h1>heading</h1><hr/>", "=heading=\n\n----\n")
|
@@ -516,11 +568,11 @@ describe TracWiki::Parser do
|
|
516
568
|
tc("<p>par par</p>", "par\npar\n")
|
517
569
|
tc("<p>par</p><p>par</p>", "par\n\npar\n")
|
518
570
|
# unordered
|
519
|
-
tc("<p>par</p><ul><li>item</li></ul>", "par\n*item")
|
520
|
-
tc("<p>par</p><ul><li>item</li></ul>", "par\n\n*item")
|
571
|
+
tc("<p>par</p><ul><li>item</li></ul>", "par\n* item")
|
572
|
+
tc("<p>par</p><ul><li>item</li></ul>", "par\n\n* item")
|
521
573
|
# ordered
|
522
|
-
tc("<p>par</p><ol><li>item</li></ol>", "par\
|
523
|
-
tc("<p>par</p><ol><li>item</li></ol>", "par\n\
|
574
|
+
tc("<p>par</p><ol><li>item</li></ol>", "par\n1. item\n")
|
575
|
+
tc("<p>par</p><ol><li>item</li></ol>", "par\n\n1. item\n")
|
524
576
|
# horizontal
|
525
577
|
tc("<p>par</p><hr/>", "par\n----\n")
|
526
578
|
tc("<p>par</p><hr/>", "par\n\n----\n")
|
@@ -534,50 +586,50 @@ describe TracWiki::Parser do
|
|
534
586
|
|
535
587
|
it 'should parse following unordered list' do
|
536
588
|
# heading
|
537
|
-
tc("<ul><li>item</li></ul><h1>heading</h1>", "*item\n=heading=")
|
538
|
-
tc("<ul><li>item</li></ul><h1>heading</h1>", "*item\n\n=heading=")
|
589
|
+
tc("<ul><li>item</li></ul><h1>heading</h1>", "* item\n=heading=")
|
590
|
+
tc("<ul><li>item</li></ul><h1>heading</h1>", "* item\n\n=heading=")
|
539
591
|
# paragraph
|
540
|
-
tc("<ul><li>item par</li></ul>", "*item\npar\n") # items may span multiple lines
|
541
|
-
tc("<ul><li>item</li></ul><p>par</p>", "*item\n\npar\n")
|
592
|
+
tc("<ul><li>item par</li></ul>", "* item\npar\n") # items may span multiple lines
|
593
|
+
tc("<ul><li>item</li></ul><p>par</p>", "* item\n\npar\n")
|
542
594
|
# unordered
|
543
|
-
tc("<ul><li>item</li><li>item</li></ul>", "*item\n*item\n")
|
544
|
-
tc("<ul><li>item</li></ul><ul><li>item</li></ul>", "*item\n\n*item\n")
|
595
|
+
tc("<ul><li>item</li><li>item</li></ul>", "* item\n* item\n")
|
596
|
+
tc("<ul><li>item</li></ul><ul><li>item</li></ul>", "* item\n\n* item\n")
|
545
597
|
# ordered
|
546
|
-
tc("<ul><li>item</li></ul><ol><li>item</li></ol>", "*item\
|
547
|
-
tc("<ul><li>item</li></ul><ol><li>item</li></ol>", "*item\n\
|
598
|
+
tc("<ul><li>item</li></ul><ol><li>item</li></ol>", "* item\n1. item\n")
|
599
|
+
tc("<ul><li>item</li></ul><ol><li>item</li></ol>", "* item\n\n1. item\n")
|
548
600
|
# horizontal rule
|
549
|
-
tc("<ul><li>item</li></ul><hr/>", "*item\n----\n")
|
550
|
-
tc("<ul><li>item</li></ul><hr/>", "*item\n\n----\n")
|
601
|
+
tc("<ul><li>item</li></ul><hr/>", "* item\n----\n")
|
602
|
+
tc("<ul><li>item</li></ul><hr/>", "* item\n\n----\n")
|
551
603
|
# nowiki
|
552
|
-
tc("<ul><li>item</li></ul><pre>nowiki</pre>", "*item\n{{{\nnowiki\n}}}\n")
|
553
|
-
tc("<ul><li>item</li></ul><pre>nowiki</pre>", "*item\n\n{{{\nnowiki\n}}}\n")
|
604
|
+
tc("<ul><li>item</li></ul><pre>nowiki</pre>", "* item\n{{{\nnowiki\n}}}\n")
|
605
|
+
tc("<ul><li>item</li></ul><pre>nowiki</pre>", "* item\n\n{{{\nnowiki\n}}}\n")
|
554
606
|
# table
|
555
|
-
tc("<ul><li>item</li></ul><table><tr><td>table</td></tr></table>", "*item\n||table||\n")
|
556
|
-
tc("<ul><li>item</li></ul><table><tr><td>table</td></tr></table>", "*item\n\n||table||\n")
|
607
|
+
tc("<ul><li>item</li></ul><table><tr><td>table</td></tr></table>", "* item\n||table||\n")
|
608
|
+
tc("<ul><li>item</li></ul><table><tr><td>table</td></tr></table>", "* item\n\n||table||\n")
|
557
609
|
end
|
558
610
|
|
559
611
|
it 'should parse following ordered list' do
|
560
612
|
# heading
|
561
|
-
tc("<ol><li>item</li></ol><h1>heading</h1>", "
|
562
|
-
tc("<ol><li>item</li></ol><h1>heading</h1>", "
|
613
|
+
tc("<ol><li>item</li></ol><h1>heading</h1>", "1. item\n=heading=")
|
614
|
+
tc("<ol><li>item</li></ol><h1>heading</h1>", "1. item\n\n=heading=")
|
563
615
|
# paragraph
|
564
|
-
tc("<ol><li>item par</li></ol>", "
|
565
|
-
tc("<ol><li>item</li></ol><p>par</p>", "
|
616
|
+
tc("<ol><li>item par</li></ol>", "1. item\npar\n") # items may span multiple lines
|
617
|
+
tc("<ol><li>item</li></ol><p>par</p>", "1. item\n\npar\n")
|
566
618
|
# unordered
|
567
|
-
tc("<ol><li>item</li></ol><ul><li>item</li></ul>", "
|
568
|
-
tc("<ol><li>item</li></ol><ul><li>item</li></ul>", "
|
619
|
+
tc("<ol><li>item</li></ol><ul><li>item</li></ul>", "1. item\n* item\n")
|
620
|
+
tc("<ol><li>item</li></ol><ul><li>item</li></ul>", "1. item\n\n* item\n")
|
569
621
|
# ordered
|
570
|
-
tc("<ol><li>item</li><li>item</li></ol>", "
|
571
|
-
tc("<ol><li>item</li></ol><ol><li>item</li></ol>", "
|
622
|
+
tc("<ol><li>item</li><li>item</li></ol>", "1. item\n2. item\n")
|
623
|
+
tc("<ol><li>item</li></ol><ol><li>item</li></ol>", "1. item\n\n1. item\n")
|
572
624
|
# horizontal role
|
573
|
-
tc("<ol><li>item</li></ol><hr/>", "
|
574
|
-
tc("<ol><li>item</li></ol><hr/>", "
|
625
|
+
tc("<ol><li>item</li></ol><hr/>", "1. item\n----\n")
|
626
|
+
tc("<ol><li>item</li></ol><hr/>", "1. item\n\n----\n")
|
575
627
|
# nowiki
|
576
|
-
tc("<ol><li>item</li></ol><pre>nowiki</pre>", "
|
577
|
-
tc("<ol><li>item</li></ol><pre>nowiki</pre>", "
|
628
|
+
tc("<ol><li>item</li></ol><pre>nowiki</pre>", "1. item\n{{{\nnowiki\n}}}\n")
|
629
|
+
tc("<ol><li>item</li></ol><pre>nowiki</pre>", "1. item\n\n{{{\nnowiki\n}}}\n")
|
578
630
|
# table
|
579
|
-
tc("<ol><li>item</li></ol><table><tr><td>table</td></tr></table>", "
|
580
|
-
tc("<ol><li>item</li></ol><table><tr><td>table</td></tr></table>", "
|
631
|
+
tc("<ol><li>item</li></ol><table><tr><td>table</td></tr></table>", "1. item\n||table||\n")
|
632
|
+
tc("<ol><li>item</li></ol><table><tr><td>table</td></tr></table>", "1. item\n\n||table||\n")
|
581
633
|
end
|
582
634
|
|
583
635
|
it 'should parse following horizontal rule' do
|
@@ -588,11 +640,14 @@ describe TracWiki::Parser do
|
|
588
640
|
tc("<hr/><p>par</p>", "----\npar\n")
|
589
641
|
tc("<hr/><p>par</p>", "----\n\npar\n")
|
590
642
|
# unordered
|
591
|
-
tc("<hr/><ul><li>item</li></ul>", "----\n*item")
|
592
|
-
tc("<hr/><ul><li>item</li></ul>", "----\n*item")
|
643
|
+
tc("<hr/><ul><li>item</li></ul>", "----\n* item")
|
644
|
+
tc("<hr/><ul><li>item</li></ul>", "----\n* item")
|
645
|
+
tc("<hr/><ul><li>item</li></ul>", "----\n- item")
|
646
|
+
tc("<hr/><ul><li>item</li></ul>", "----\n- item")
|
647
|
+
tc("<hr/><ul><li>item</li></ul>", "----\n - item")
|
593
648
|
# ordered
|
594
|
-
tc("<hr/><ol><li>item</li></ol>", "----\
|
595
|
-
tc("<hr/><ol><li>item</li></ol>", "----\
|
649
|
+
tc("<hr/><ol><li>item</li></ol>", "----\n1. item")
|
650
|
+
tc("<hr/><ol><li>item</li></ol>", "----\n1. item")
|
596
651
|
# horizontal
|
597
652
|
tc("<hr/><hr/>", "----\n----\n")
|
598
653
|
tc("<hr/><hr/>", "----\n\n----\n")
|
@@ -612,11 +667,11 @@ describe TracWiki::Parser do
|
|
612
667
|
tc("<pre>nowiki</pre><p>par</p>", "{{{\nnowiki\n}}}\npar")
|
613
668
|
tc("<pre>nowiki</pre><p>par</p>", "{{{\nnowiki\n}}}\n\npar")
|
614
669
|
# unordered
|
615
|
-
tc("<pre>nowiki</pre><ul><li>item</li></ul>", "{{{\nnowiki\n}}}\n*item\n")
|
616
|
-
tc("<pre>nowiki</pre><ul><li>item</li></ul>", "{{{\nnowiki\n}}}\n\n*item\n")
|
670
|
+
tc("<pre>nowiki</pre><ul><li>item</li></ul>", "{{{\nnowiki\n}}}\n* item\n")
|
671
|
+
tc("<pre>nowiki</pre><ul><li>item</li></ul>", "{{{\nnowiki\n}}}\n\n* item\n")
|
617
672
|
# ordered
|
618
|
-
tc("<pre>nowiki</pre><ol><li>item</li></ol>", "{{{\nnowiki\n}}}\
|
619
|
-
tc("<pre>nowiki</pre><ol><li>item</li></ol>", "{{{\nnowiki\n}}}\n\
|
673
|
+
tc("<pre>nowiki</pre><ol><li>item</li></ol>", "{{{\nnowiki\n}}}\n1. item\n")
|
674
|
+
tc("<pre>nowiki</pre><ol><li>item</li></ol>", "{{{\nnowiki\n}}}\n\n1. item\n")
|
620
675
|
# horizontal
|
621
676
|
tc("<pre>nowiki</pre><hr/>", "{{{\nnowiki\n}}}\n----\n")
|
622
677
|
tc("<pre>nowiki</pre><hr/>", "{{{\nnowiki\n}}}\n\n----\n")
|
@@ -629,9 +684,9 @@ describe TracWiki::Parser do
|
|
629
684
|
end
|
630
685
|
|
631
686
|
it 'should parse image' do
|
632
|
-
tc("<p><img src
|
633
|
-
tc("<p><img src
|
634
|
-
tc("<p><img src
|
687
|
+
tc("<p><img src='image.jpg'/></p>", "[[Image(image.jpg)]]")
|
688
|
+
tc("<p><img src='image.jpg' alt='tag'/></p>", "[[Image(image.jpg|tag)]]")
|
689
|
+
tc("<p><img src='http://example.org/image.jpg'/></p>", "[[Image(http://example.org/image.jpg)]]")
|
635
690
|
end
|
636
691
|
|
637
692
|
it 'should parse bold combo' do
|
@@ -647,7 +702,7 @@ describe TracWiki::Parser do
|
|
647
702
|
"This is ~~deleted~~")
|
648
703
|
|
649
704
|
tce("<p>This is <sup>super</sup></p>",
|
650
|
-
"This is
|
705
|
+
"This is ^super^")
|
651
706
|
|
652
707
|
tce("<p>This is <sub>sub</sub></p>",
|
653
708
|
"This is ,,sub,,")
|
@@ -663,3 +718,4 @@ describe TracWiki::Parser do
|
|
663
718
|
tc("<p><a href=\"a/b/c\">a/b/c</a></p>", "[[a/b/c]]", :no_escape => true)
|
664
719
|
end
|
665
720
|
end
|
721
|
+
# vim: tw=0
|