Subversion-Projekte lars-tiefland.ci

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
776 lars 1
// CodeMirror, copyright (c) by Marijn Haverbeke and others
2
// Distributed under an MIT license: http://codemirror.net/LICENSE
3
 
4
(function() {
5
  var mode = CodeMirror.getMode({tabSize: 4}, "markdown");
6
  function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); }
7
  var modeHighlightFormatting = CodeMirror.getMode({tabSize: 4}, {name: "markdown", highlightFormatting: true});
8
  function FT(name) { test.mode(name, modeHighlightFormatting, Array.prototype.slice.call(arguments, 1)); }
9
 
10
  FT("formatting_emAsterisk",
11
     "[em&formatting&formatting-em *][em foo][em&formatting&formatting-em *]");
12
 
13
  FT("formatting_emUnderscore",
14
     "[em&formatting&formatting-em _][em foo][em&formatting&formatting-em _]");
15
 
16
  FT("formatting_strongAsterisk",
17
     "[strong&formatting&formatting-strong **][strong foo][strong&formatting&formatting-strong **]");
18
 
19
  FT("formatting_strongUnderscore",
20
     "[strong&formatting&formatting-strong __][strong foo][strong&formatting&formatting-strong __]");
21
 
22
  FT("formatting_codeBackticks",
23
     "[comment&formatting&formatting-code `][comment foo][comment&formatting&formatting-code `]");
24
 
25
  FT("formatting_doubleBackticks",
26
     "[comment&formatting&formatting-code ``][comment foo ` bar][comment&formatting&formatting-code ``]");
27
 
28
  FT("formatting_atxHeader",
29
     "[header&header-1&formatting&formatting-header&formatting-header-1 # ][header&header-1 foo # bar ][header&header-1&formatting&formatting-header&formatting-header-1 #]");
30
 
31
  FT("formatting_setextHeader",
32
     "foo",
33
     "[header&header-1&formatting&formatting-header&formatting-header-1 =]");
34
 
35
  FT("formatting_blockquote",
36
     "[quote&quote-1&formatting&formatting-quote&formatting-quote-1 > ][quote&quote-1 foo]");
37
 
38
  FT("formatting_list",
39
     "[variable-2&formatting&formatting-list&formatting-list-ul - ][variable-2 foo]");
40
  FT("formatting_list",
41
     "[variable-2&formatting&formatting-list&formatting-list-ol 1. ][variable-2 foo]");
42
 
43
  FT("formatting_link",
44
     "[link&formatting&formatting-link [][link foo][link&formatting&formatting-link ]]][string&formatting&formatting-link-string&url (][string&url http://example.com/][string&formatting&formatting-link-string&url )]");
45
 
46
  FT("formatting_linkReference",
47
     "[link&formatting&formatting-link [][link foo][link&formatting&formatting-link ]]][string&formatting&formatting-link-string&url [][string&url bar][string&formatting&formatting-link-string&url ]]]",
48
     "[link&formatting&formatting-link [][link bar][link&formatting&formatting-link ]]:] [string&url http://example.com/]");
49
 
50
  FT("formatting_linkWeb",
51
     "[link&formatting&formatting-link <][link http://example.com/][link&formatting&formatting-link >]");
52
 
53
  FT("formatting_linkEmail",
54
     "[link&formatting&formatting-link <][link user@example.com][link&formatting&formatting-link >]");
55
 
56
  FT("formatting_escape",
57
     "[formatting-escape \\*]");
58
 
59
  MT("plainText",
60
     "foo");
61
 
62
  // Don't style single trailing space
63
  MT("trailingSpace1",
64
     "foo ");
65
 
66
  // Two or more trailing spaces should be styled with line break character
67
  MT("trailingSpace2",
68
     "foo[trailing-space-a  ][trailing-space-new-line  ]");
69
 
70
  MT("trailingSpace3",
71
     "foo[trailing-space-a  ][trailing-space-b  ][trailing-space-new-line  ]");
72
 
73
  MT("trailingSpace4",
74
     "foo[trailing-space-a  ][trailing-space-b  ][trailing-space-a  ][trailing-space-new-line  ]");
75
 
76
  // Code blocks using 4 spaces (regardless of CodeMirror.tabSize value)
77
  MT("codeBlocksUsing4Spaces",
78
     "    [comment foo]");
79
 
80
  // Code blocks using 4 spaces with internal indentation
81
  MT("codeBlocksUsing4SpacesIndentation",
82
     "    [comment bar]",
83
     "        [comment hello]",
84
     "            [comment world]",
85
     "    [comment foo]",
86
     "bar");
87
 
88
  // Code blocks should end even after extra indented lines
89
  MT("codeBlocksWithTrailingIndentedLine",
90
     "    [comment foo]",
91
     "        [comment bar]",
92
     "    [comment baz]",
93
     "    ",
94
     "hello");
95
 
96
  // Code blocks using 1 tab (regardless of CodeMirror.indentWithTabs value)
97
  MT("codeBlocksUsing1Tab",
98
     "\t[comment foo]");
99
 
100
  // No code blocks directly after paragraph
101
  // http://spec.commonmark.org/0.19/#example-65
102
  MT("noCodeBlocksAfterParagraph",
103
     "Foo",
104
     "    Bar");
105
 
106
  // Inline code using backticks
107
  MT("inlineCodeUsingBackticks",
108
     "foo [comment `bar`]");
109
 
110
  // Block code using single backtick (shouldn't work)
111
  MT("blockCodeSingleBacktick",
112
     "[comment `]",
113
     "foo",
114
     "[comment `]");
115
 
116
  // Unclosed backticks
117
  // Instead of simply marking as CODE, it would be nice to have an
118
  // incomplete flag for CODE, that is styled slightly different.
119
  MT("unclosedBackticks",
120
     "foo [comment `bar]");
121
 
122
  // Per documentation: "To include a literal backtick character within a
123
  // code span, you can use multiple backticks as the opening and closing
124
  // delimiters"
125
  MT("doubleBackticks",
126
     "[comment ``foo ` bar``]");
127
 
128
  // Tests based on Dingus
129
  // http://daringfireball.net/projects/markdown/dingus
130
  //
131
  // Multiple backticks within an inline code block
132
  MT("consecutiveBackticks",
133
     "[comment `foo```bar`]");
134
 
135
  // Multiple backticks within an inline code block with a second code block
136
  MT("consecutiveBackticks",
137
     "[comment `foo```bar`] hello [comment `world`]");
138
 
139
  // Unclosed with several different groups of backticks
140
  MT("unclosedBackticks",
141
     "[comment ``foo ``` bar` hello]");
142
 
143
  // Closed with several different groups of backticks
144
  MT("closedBackticks",
145
     "[comment ``foo ``` bar` hello``] world");
146
 
147
  // atx headers
148
  // http://daringfireball.net/projects/markdown/syntax#header
149
 
150
  MT("atxH1",
151
     "[header&header-1 # foo]");
152
 
153
  MT("atxH2",
154
     "[header&header-2 ## foo]");
155
 
156
  MT("atxH3",
157
     "[header&header-3 ### foo]");
158
 
159
  MT("atxH4",
160
     "[header&header-4 #### foo]");
161
 
162
  MT("atxH5",
163
     "[header&header-5 ##### foo]");
164
 
165
  MT("atxH6",
166
     "[header&header-6 ###### foo]");
167
 
168
  // http://spec.commonmark.org/0.19/#example-24
169
  MT("noAtxH7",
170
     "####### foo");
171
 
172
  // http://spec.commonmark.org/0.19/#example-25
173
  MT("noAtxH1WithoutSpace",
174
     "#5 bolt");
175
 
176
  // Inline styles should be parsed inside headers
177
  MT("atxH1inline",
178
     "[header&header-1 # foo ][header&header-1&em *bar*]");
179
 
180
  // Setext headers - H1, H2
181
  // Per documentation, "Any number of underlining =’s or -’s will work."
182
  // http://daringfireball.net/projects/markdown/syntax#header
183
  // Ideally, the text would be marked as `header` as well, but this is
184
  // not really feasible at the moment. So, instead, we're testing against
185
  // what works today, to avoid any regressions.
186
  //
187
  // Check if single underlining = works
188
  MT("setextH1",
189
     "foo",
190
     "[header&header-1 =]");
191
 
192
  // Check if 3+ ='s work
193
  MT("setextH1",
194
     "foo",
195
     "[header&header-1 ===]");
196
 
197
  // Check if single underlining - works
198
  MT("setextH2",
199
     "foo",
200
     "[header&header-2 -]");
201
 
202
  // Check if 3+ -'s work
203
  MT("setextH2",
204
     "foo",
205
     "[header&header-2 ---]");
206
 
207
  // http://spec.commonmark.org/0.19/#example-45
208
  MT("setextH2AllowSpaces",
209
     "foo",
210
     "   [header&header-2 ----      ]");
211
 
212
  // http://spec.commonmark.org/0.19/#example-44
213
  MT("noSetextAfterIndentedCodeBlock",
214
     "     [comment foo]",
215
     "[hr ---]");
216
 
217
  // http://spec.commonmark.org/0.19/#example-51
218
  MT("noSetextAfterQuote",
219
     "[quote&quote-1 > foo]",
220
     "[hr ---]");
221
 
222
  MT("noSetextAfterList",
223
     "[variable-2 - foo]",
224
     "[hr ---]");
225
 
226
  // Single-line blockquote with trailing space
227
  MT("blockquoteSpace",
228
     "[quote&quote-1 > foo]");
229
 
230
  // Single-line blockquote
231
  MT("blockquoteNoSpace",
232
     "[quote&quote-1 >foo]");
233
 
234
  // No blank line before blockquote
235
  MT("blockquoteNoBlankLine",
236
     "foo",
237
     "[quote&quote-1 > bar]");
238
 
239
  // Nested blockquote
240
  MT("blockquoteSpace",
241
     "[quote&quote-1 > foo]",
242
     "[quote&quote-1 >][quote&quote-2 > foo]",
243
     "[quote&quote-1 >][quote&quote-2 >][quote&quote-3 > foo]");
244
 
245
  // Single-line blockquote followed by normal paragraph
246
  MT("blockquoteThenParagraph",
247
     "[quote&quote-1 >foo]",
248
     "",
249
     "bar");
250
 
251
  // Multi-line blockquote (lazy mode)
252
  MT("multiBlockquoteLazy",
253
     "[quote&quote-1 >foo]",
254
     "[quote&quote-1 bar]");
255
 
256
  // Multi-line blockquote followed by normal paragraph (lazy mode)
257
  MT("multiBlockquoteLazyThenParagraph",
258
     "[quote&quote-1 >foo]",
259
     "[quote&quote-1 bar]",
260
     "",
261
     "hello");
262
 
263
  // Multi-line blockquote (non-lazy mode)
264
  MT("multiBlockquote",
265
     "[quote&quote-1 >foo]",
266
     "[quote&quote-1 >bar]");
267
 
268
  // Multi-line blockquote followed by normal paragraph (non-lazy mode)
269
  MT("multiBlockquoteThenParagraph",
270
     "[quote&quote-1 >foo]",
271
     "[quote&quote-1 >bar]",
272
     "",
273
     "hello");
274
 
275
  // Header with leading space after continued blockquote (#3287, negative indentation)
276
  MT("headerAfterContinuedBlockquote",
277
     "[quote&quote-1 > foo]",
278
     "[quote&quote-1 bar]",
279
     "",
280
     " [header&header-1 # hello]");
281
 
282
  // Check list types
283
 
284
  MT("listAsterisk",
285
     "foo",
286
     "bar",
287
     "",
288
     "[variable-2 * foo]",
289
     "[variable-2 * bar]");
290
 
291
  MT("listPlus",
292
     "foo",
293
     "bar",
294
     "",
295
     "[variable-2 + foo]",
296
     "[variable-2 + bar]");
297
 
298
  MT("listDash",
299
     "foo",
300
     "bar",
301
     "",
302
     "[variable-2 - foo]",
303
     "[variable-2 - bar]");
304
 
305
  MT("listNumber",
306
     "foo",
307
     "bar",
308
     "",
309
     "[variable-2 1. foo]",
310
     "[variable-2 2. bar]");
311
 
312
  // Lists require a preceding blank line (per Dingus)
313
  MT("listBogus",
314
     "foo",
315
     "1. bar",
316
     "2. hello");
317
 
318
  // List after hr
319
  MT("listAfterHr",
320
     "[hr ---]",
321
     "[variable-2 - bar]");
322
 
323
  // List after header
324
  MT("listAfterHeader",
325
     "[header&header-1 # foo]",
326
     "[variable-2 - bar]");
327
 
328
  // hr after list
329
  MT("hrAfterList",
330
     "[variable-2 - foo]",
331
     "[hr -----]");
332
 
333
  // Formatting in lists (*)
334
  MT("listAsteriskFormatting",
335
     "[variable-2 * ][variable-2&em *foo*][variable-2  bar]",
336
     "[variable-2 * ][variable-2&strong **foo**][variable-2  bar]",
337
     "[variable-2 * ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2  bar]",
338
     "[variable-2 * ][variable-2&comment `foo`][variable-2  bar]");
339
 
340
  // Formatting in lists (+)
341
  MT("listPlusFormatting",
342
     "[variable-2 + ][variable-2&em *foo*][variable-2  bar]",
343
     "[variable-2 + ][variable-2&strong **foo**][variable-2  bar]",
344
     "[variable-2 + ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2  bar]",
345
     "[variable-2 + ][variable-2&comment `foo`][variable-2  bar]");
346
 
347
  // Formatting in lists (-)
348
  MT("listDashFormatting",
349
     "[variable-2 - ][variable-2&em *foo*][variable-2  bar]",
350
     "[variable-2 - ][variable-2&strong **foo**][variable-2  bar]",
351
     "[variable-2 - ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2  bar]",
352
     "[variable-2 - ][variable-2&comment `foo`][variable-2  bar]");
353
 
354
  // Formatting in lists (1.)
355
  MT("listNumberFormatting",
356
     "[variable-2 1. ][variable-2&em *foo*][variable-2  bar]",
357
     "[variable-2 2. ][variable-2&strong **foo**][variable-2  bar]",
358
     "[variable-2 3. ][variable-2&strong **][variable-2&em&strong *foo**][variable-2&em *][variable-2  bar]",
359
     "[variable-2 4. ][variable-2&comment `foo`][variable-2  bar]");
360
 
361
  // Paragraph lists
362
  MT("listParagraph",
363
     "[variable-2 * foo]",
364
     "",
365
     "[variable-2 * bar]");
366
 
367
  // Multi-paragraph lists
368
  //
369
  // 4 spaces
370
  MT("listMultiParagraph",
371
     "[variable-2 * foo]",
372
     "",
373
     "[variable-2 * bar]",
374
     "",
375
     "    [variable-2 hello]");
376
 
377
  // 4 spaces, extra blank lines (should still be list, per Dingus)
378
  MT("listMultiParagraphExtra",
379
     "[variable-2 * foo]",
380
     "",
381
     "[variable-2 * bar]",
382
     "",
383
     "",
384
     "    [variable-2 hello]");
385
 
386
  // 4 spaces, plus 1 space (should still be list, per Dingus)
387
  MT("listMultiParagraphExtraSpace",
388
     "[variable-2 * foo]",
389
     "",
390
     "[variable-2 * bar]",
391
     "",
392
     "     [variable-2 hello]",
393
     "",
394
     "    [variable-2 world]");
395
 
396
  // 1 tab
397
  MT("listTab",
398
     "[variable-2 * foo]",
399
     "",
400
     "[variable-2 * bar]",
401
     "",
402
     "\t[variable-2 hello]");
403
 
404
  // No indent
405
  MT("listNoIndent",
406
     "[variable-2 * foo]",
407
     "",
408
     "[variable-2 * bar]",
409
     "",
410
     "hello");
411
 
412
  // Blockquote
413
  MT("blockquote",
414
     "[variable-2 * foo]",
415
     "",
416
     "[variable-2 * bar]",
417
     "",
418
     "    [variable-2&quote&quote-1 > hello]");
419
 
420
  // Code block
421
  MT("blockquoteCode",
422
     "[variable-2 * foo]",
423
     "",
424
     "[variable-2 * bar]",
425
     "",
426
     "        [comment > hello]",
427
     "",
428
     "    [variable-2 world]");
429
 
430
  // Code block followed by text
431
  MT("blockquoteCodeText",
432
     "[variable-2 * foo]",
433
     "",
434
     "    [variable-2 bar]",
435
     "",
436
     "        [comment hello]",
437
     "",
438
     "    [variable-2 world]");
439
 
440
  // Nested list
441
 
442
  MT("listAsteriskNested",
443
     "[variable-2 * foo]",
444
     "",
445
     "    [variable-3 * bar]");
446
 
447
  MT("listPlusNested",
448
     "[variable-2 + foo]",
449
     "",
450
     "    [variable-3 + bar]");
451
 
452
  MT("listDashNested",
453
     "[variable-2 - foo]",
454
     "",
455
     "    [variable-3 - bar]");
456
 
457
  MT("listNumberNested",
458
     "[variable-2 1. foo]",
459
     "",
460
     "    [variable-3 2. bar]");
461
 
462
  MT("listMixed",
463
     "[variable-2 * foo]",
464
     "",
465
     "    [variable-3 + bar]",
466
     "",
467
     "        [keyword - hello]",
468
     "",
469
     "            [variable-2 1. world]");
470
 
471
  MT("listBlockquote",
472
     "[variable-2 * foo]",
473
     "",
474
     "    [variable-3 + bar]",
475
     "",
476
     "        [quote&quote-1&variable-3 > hello]");
477
 
478
  MT("listCode",
479
     "[variable-2 * foo]",
480
     "",
481
     "    [variable-3 + bar]",
482
     "",
483
     "            [comment hello]");
484
 
485
  // Code with internal indentation
486
  MT("listCodeIndentation",
487
     "[variable-2 * foo]",
488
     "",
489
     "        [comment bar]",
490
     "            [comment hello]",
491
     "                [comment world]",
492
     "        [comment foo]",
493
     "    [variable-2 bar]");
494
 
495
  // List nesting edge cases
496
  MT("listNested",
497
    "[variable-2 * foo]",
498
    "",
499
    "    [variable-3 * bar]",
500
    "",
501
    "       [variable-2 hello]"
502
  );
503
  MT("listNested",
504
    "[variable-2 * foo]",
505
    "",
506
    "    [variable-3 * bar]",
507
    "",
508
    "      [variable-3 * foo]"
509
  );
510
 
511
  // Code followed by text
512
  MT("listCodeText",
513
     "[variable-2 * foo]",
514
     "",
515
     "        [comment bar]",
516
     "",
517
     "hello");
518
 
519
  // Following tests directly from official Markdown documentation
520
  // http://daringfireball.net/projects/markdown/syntax#hr
521
 
522
  MT("hrSpace",
523
     "[hr * * *]");
524
 
525
  MT("hr",
526
     "[hr ***]");
527
 
528
  MT("hrLong",
529
     "[hr *****]");
530
 
531
  MT("hrSpaceDash",
532
     "[hr - - -]");
533
 
534
  MT("hrDashLong",
535
     "[hr ---------------------------------------]");
536
 
537
  // Inline link with title
538
  MT("linkTitle",
539
     "[link [[foo]]][string&url (http://example.com/ \"bar\")] hello");
540
 
541
  // Inline link without title
542
  MT("linkNoTitle",
543
     "[link [[foo]]][string&url (http://example.com/)] bar");
544
 
545
  // Inline link with image
546
  MT("linkImage",
547
     "[link [[][tag ![[foo]]][string&url (http://example.com/)][link ]]][string&url (http://example.com/)] bar");
548
 
549
  // Inline link with Em
550
  MT("linkEm",
551
     "[link [[][link&em *foo*][link ]]][string&url (http://example.com/)] bar");
552
 
553
  // Inline link with Strong
554
  MT("linkStrong",
555
     "[link [[][link&strong **foo**][link ]]][string&url (http://example.com/)] bar");
556
 
557
  // Inline link with EmStrong
558
  MT("linkEmStrong",
559
     "[link [[][link&strong **][link&em&strong *foo**][link&em *][link ]]][string&url (http://example.com/)] bar");
560
 
561
  // Image with title
562
  MT("imageTitle",
563
     "[tag ![[foo]]][string&url (http://example.com/ \"bar\")] hello");
564
 
565
  // Image without title
566
  MT("imageNoTitle",
567
     "[tag ![[foo]]][string&url (http://example.com/)] bar");
568
 
569
  // Image with asterisks
570
  MT("imageAsterisks",
571
     "[tag ![[*foo*]]][string&url (http://example.com/)] bar");
572
 
573
  // Not a link. Should be normal text due to square brackets being used
574
  // regularly in text, especially in quoted material, and no space is allowed
575
  // between square brackets and parentheses (per Dingus).
576
  MT("notALink",
577
     "[[foo]] (bar)");
578
 
579
  // Reference-style links
580
  MT("linkReference",
581
     "[link [[foo]]][string&url [[bar]]] hello");
582
 
583
  // Reference-style links with Em
584
  MT("linkReferenceEm",
585
     "[link [[][link&em *foo*][link ]]][string&url [[bar]]] hello");
586
 
587
  // Reference-style links with Strong
588
  MT("linkReferenceStrong",
589
     "[link [[][link&strong **foo**][link ]]][string&url [[bar]]] hello");
590
 
591
  // Reference-style links with EmStrong
592
  MT("linkReferenceEmStrong",
593
     "[link [[][link&strong **][link&em&strong *foo**][link&em *][link ]]][string&url [[bar]]] hello");
594
 
595
  // Reference-style links with optional space separator (per docuentation)
596
  // "You can optionally use a space to separate the sets of brackets"
597
  MT("linkReferenceSpace",
598
     "[link [[foo]]] [string&url [[bar]]] hello");
599
 
600
  // Should only allow a single space ("...use *a* space...")
601
  MT("linkReferenceDoubleSpace",
602
     "[[foo]]  [[bar]] hello");
603
 
604
  // Reference-style links with implicit link name
605
  MT("linkImplicit",
606
     "[link [[foo]]][string&url [[]]] hello");
607
 
608
  // @todo It would be nice if, at some point, the document was actually
609
  // checked to see if the referenced link exists
610
 
611
  // Link label, for reference-style links (taken from documentation)
612
 
613
  MT("labelNoTitle",
614
     "[link [[foo]]:] [string&url http://example.com/]");
615
 
616
  MT("labelIndented",
617
     "   [link [[foo]]:] [string&url http://example.com/]");
618
 
619
  MT("labelSpaceTitle",
620
     "[link [[foo bar]]:] [string&url http://example.com/ \"hello\"]");
621
 
622
  MT("labelDoubleTitle",
623
     "[link [[foo bar]]:] [string&url http://example.com/ \"hello\"] \"world\"");
624
 
625
  MT("labelTitleDoubleQuotes",
626
     "[link [[foo]]:] [string&url http://example.com/  \"bar\"]");
627
 
628
  MT("labelTitleSingleQuotes",
629
     "[link [[foo]]:] [string&url http://example.com/  'bar']");
630
 
631
  MT("labelTitleParenthese",
632
     "[link [[foo]]:] [string&url http://example.com/  (bar)]");
633
 
634
  MT("labelTitleInvalid",
635
     "[link [[foo]]:] [string&url http://example.com/] bar");
636
 
637
  MT("labelLinkAngleBrackets",
638
     "[link [[foo]]:] [string&url <http://example.com/>  \"bar\"]");
639
 
640
  MT("labelTitleNextDoubleQuotes",
641
     "[link [[foo]]:] [string&url http://example.com/]",
642
     "[string \"bar\"] hello");
643
 
644
  MT("labelTitleNextSingleQuotes",
645
     "[link [[foo]]:] [string&url http://example.com/]",
646
     "[string 'bar'] hello");
647
 
648
  MT("labelTitleNextParenthese",
649
     "[link [[foo]]:] [string&url http://example.com/]",
650
     "[string (bar)] hello");
651
 
652
  MT("labelTitleNextMixed",
653
     "[link [[foo]]:] [string&url http://example.com/]",
654
     "(bar\" hello");
655
 
656
  MT("linkWeb",
657
     "[link <http://example.com/>] foo");
658
 
659
  MT("linkWebDouble",
660
     "[link <http://example.com/>] foo [link <http://example.com/>]");
661
 
662
  MT("linkEmail",
663
     "[link <user@example.com>] foo");
664
 
665
  MT("linkEmailDouble",
666
     "[link <user@example.com>] foo [link <user@example.com>]");
667
 
668
  MT("emAsterisk",
669
     "[em *foo*] bar");
670
 
671
  MT("emUnderscore",
672
     "[em _foo_] bar");
673
 
674
  MT("emInWordAsterisk",
675
     "foo[em *bar*]hello");
676
 
677
  MT("emInWordUnderscore",
678
     "foo[em _bar_]hello");
679
 
680
  // Per documentation: "...surround an * or _ with spaces, it’ll be
681
  // treated as a literal asterisk or underscore."
682
 
683
  MT("emEscapedBySpaceIn",
684
     "foo [em _bar _ hello_] world");
685
 
686
  MT("emEscapedBySpaceOut",
687
     "foo _ bar[em _hello_]world");
688
 
689
  MT("emEscapedByNewline",
690
     "foo",
691
     "_ bar[em _hello_]world");
692
 
693
  // Unclosed emphasis characters
694
  // Instead of simply marking as EM / STRONG, it would be nice to have an
695
  // incomplete flag for EM and STRONG, that is styled slightly different.
696
  MT("emIncompleteAsterisk",
697
     "foo [em *bar]");
698
 
699
  MT("emIncompleteUnderscore",
700
     "foo [em _bar]");
701
 
702
  MT("strongAsterisk",
703
     "[strong **foo**] bar");
704
 
705
  MT("strongUnderscore",
706
     "[strong __foo__] bar");
707
 
708
  MT("emStrongAsterisk",
709
     "[em *foo][em&strong **bar*][strong hello**] world");
710
 
711
  MT("emStrongUnderscore",
712
     "[em _foo][em&strong __bar_][strong hello__] world");
713
 
714
  // "...same character must be used to open and close an emphasis span.""
715
  MT("emStrongMixed",
716
     "[em _foo][em&strong **bar*hello__ world]");
717
 
718
  MT("emStrongMixed",
719
     "[em *foo][em&strong __bar_hello** world]");
720
 
721
  // These characters should be escaped:
722
  // \   backslash
723
  // `   backtick
724
  // *   asterisk
725
  // _   underscore
726
  // {}  curly braces
727
  // []  square brackets
728
  // ()  parentheses
729
  // #   hash mark
730
  // +   plus sign
731
  // -   minus sign (hyphen)
732
  // .   dot
733
  // !   exclamation mark
734
 
735
  MT("escapeBacktick",
736
     "foo \\`bar\\`");
737
 
738
  MT("doubleEscapeBacktick",
739
     "foo \\\\[comment `bar\\\\`]");
740
 
741
  MT("escapeAsterisk",
742
     "foo \\*bar\\*");
743
 
744
  MT("doubleEscapeAsterisk",
745
     "foo \\\\[em *bar\\\\*]");
746
 
747
  MT("escapeUnderscore",
748
     "foo \\_bar\\_");
749
 
750
  MT("doubleEscapeUnderscore",
751
     "foo \\\\[em _bar\\\\_]");
752
 
753
  MT("escapeHash",
754
     "\\# foo");
755
 
756
  MT("doubleEscapeHash",
757
     "\\\\# foo");
758
 
759
  MT("escapeNewline",
760
     "\\",
761
     "[em *foo*]");
762
 
763
 
764
  // Tests to make sure GFM-specific things aren't getting through
765
 
766
  MT("taskList",
767
     "[variable-2 * [ ]] bar]");
768
 
769
  MT("fencedCodeBlocks",
770
     "[comment ```]",
771
     "foo",
772
     "[comment ```]");
773
 
774
  // Tests that require XML mode
775
 
776
  MT("xmlMode",
777
     "[tag&bracket <][tag div][tag&bracket >]",
778
     "*foo*",
779
     "[tag&bracket <][tag http://github.com][tag&bracket />]",
780
     "[tag&bracket </][tag div][tag&bracket >]",
781
     "[link <http://github.com/>]");
782
 
783
  MT("xmlModeWithMarkdownInside",
784
     "[tag&bracket <][tag div] [attribute markdown]=[string 1][tag&bracket >]",
785
     "[em *foo*]",
786
     "[link <http://github.com/>]",
787
     "[tag </div>]",
788
     "[link <http://github.com/>]",
789
     "[tag&bracket <][tag div][tag&bracket >]",
790
     "[tag&bracket </][tag div][tag&bracket >]");
791
 
792
})();