github.com/ashishbhate/mattermost-server@v5.11.1+incompatible/utils/markdown/commonmark_test.go (about)

     1  // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package markdown
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  )
    11  
    12  func TestCommonMarkReferenceStrings(t *testing.T) {
    13  	// For the most part, we aim for CommonMark compliance with the features that we support. We
    14  	// also support some GitHub flavored extensions.
    15  	//
    16  	// You can find most of the references used here: https://github.github.com/gfm/
    17  
    18  	// CommonMark handles leading tabs that aren't on 4-character boundaries differently, so the
    19  	// following reference strings will fail. The current implementation is much closer to our
    20  	// webapp's behavior though, so I'm leaving it as is for now. It doesn't really impact anything
    21  	// we use this package for anyways.
    22  	//
    23  	// "  \tfoo\tbaz\t\tbim\n": "<pre><code>foo\tbaz\t\tbim\n</code></pre>",
    24  	// ">\t\tfoo":              "<blockquote><pre><code>   foo</code></pre></blockquote>",
    25  
    26  	for name, tc := range map[string]struct {
    27  		Markdown     string
    28  		ExpectedHTML string
    29  	}{
    30  		"0.28-gfm-1": {
    31  			Markdown:     "\tfoo\tbaz\t\tbim\n",
    32  			ExpectedHTML: "<pre><code>foo\tbaz\t\tbim\n</code></pre>",
    33  		},
    34  		"0.28-gfm-3": {
    35  			Markdown:     "    a\ta\n    ὐ\ta\n",
    36  			ExpectedHTML: "<pre><code>a\ta\nὐ\ta\n</code></pre>",
    37  		},
    38  		"0.28-gfm-4": {
    39  			Markdown:     "  - foo\n\n\tbar\n",
    40  			ExpectedHTML: "<ul><li><p>foo</p><p>bar</p></li></ul>",
    41  		},
    42  		"0.28-gfm-5": {
    43  			Markdown:     "- foo\n\n\t\tbar",
    44  			ExpectedHTML: "<ul><li><p>foo</p><pre><code>  bar</code></pre></li></ul>",
    45  		},
    46  		"0.28-gfm-8": {
    47  			Markdown:     "    foo\n\tbar",
    48  			ExpectedHTML: "<pre><code>foo\nbar</code></pre>",
    49  		},
    50  		"0.28-gfm-9": {
    51  			Markdown:     " - foo\n   - bar\n\t - baz",
    52  			ExpectedHTML: "<ul><li>foo<ul><li>bar<ul><li>baz</li></ul></li></ul></li></ul>",
    53  		},
    54  		"0.28-gfm-12": {
    55  			Markdown:     "- `one\n- two`",
    56  			ExpectedHTML: "<ul><li>`one</li><li>two`</li></ul>",
    57  		},
    58  		"0.28-gfm-76": {
    59  			Markdown:     "    a simple\n      indented code block",
    60  			ExpectedHTML: "<pre><code>a simple\n  indented code block</code></pre>",
    61  		},
    62  		"0.28-gfm-77": {
    63  			Markdown:     "  - foo\n\n    bar",
    64  			ExpectedHTML: "<ul><li><p>foo</p><p>bar</p></li></ul>",
    65  		},
    66  		"0.28-gfm-78": {
    67  			Markdown:     "1.  foo\n\n    - bar",
    68  			ExpectedHTML: "<ol><li><p>foo</p><ul><li>bar</li></ul></li></ol>",
    69  		},
    70  		"0.28-gfm-79": {
    71  			Markdown:     "    <a/>\n    *hi*\n\n    - one",
    72  			ExpectedHTML: "<pre><code>&lt;a/&gt;\n*hi*\n\n- one</code></pre>",
    73  		},
    74  		"0.28-gfm-80": {
    75  			Markdown:     "    chunk1\n\n    chunk2\n  \n \n \n    chunk3",
    76  			ExpectedHTML: "<pre><code>chunk1\n\nchunk2\n\n\n\nchunk3</code></pre>",
    77  		},
    78  		"0.28-gfm-81": {
    79  			Markdown:     "    chunk1\n      \n      chunk2",
    80  			ExpectedHTML: "<pre><code>chunk1\n  \n  chunk2</code></pre>",
    81  		},
    82  		"0.28-gfm-82": {
    83  			Markdown:     "Foo\n    bar",
    84  			ExpectedHTML: "<p>Foo\nbar</p>",
    85  		},
    86  		"0.28-gfm-83": {
    87  			Markdown:     "    foo\nbar",
    88  			ExpectedHTML: "<pre><code>foo\n</code></pre><p>bar</p>",
    89  		},
    90  		"0.28-gfm-85": {
    91  			Markdown:     "        foo\n    bar",
    92  			ExpectedHTML: "<pre><code>    foo\nbar</code></pre>",
    93  		},
    94  		"0.28-gfm-86": {
    95  			Markdown:     "\n    \n    foo\n    ",
    96  			ExpectedHTML: "<pre><code>foo\n</code></pre>",
    97  		},
    98  		"0.28-gfm-87": {
    99  			Markdown:     "    foo  ",
   100  			ExpectedHTML: "<pre><code>foo  </code></pre>",
   101  		},
   102  		"0.28-gfm-88": {
   103  			Markdown:     "```\n<\n >\n```",
   104  			ExpectedHTML: "<pre><code>&lt;\n &gt;\n</code></pre>",
   105  		},
   106  		"0.28-gfm-89": {
   107  			Markdown:     "~~~\n<\n >\n~~~",
   108  			ExpectedHTML: "<pre><code>&lt;\n &gt;\n</code></pre>",
   109  		},
   110  		"0.28-gfm-91": {
   111  			Markdown:     "```\naaa\n~~~\n```",
   112  			ExpectedHTML: "<pre><code>aaa\n~~~\n</code></pre>",
   113  		},
   114  		"0.28-gfm-92": {
   115  			Markdown:     "~~~\naaa\n```\n~~~",
   116  			ExpectedHTML: "<pre><code>aaa\n```\n</code></pre>",
   117  		},
   118  		"0.28-gfm-93": {
   119  			Markdown:     "````\naaa\n```\n``````",
   120  			ExpectedHTML: "<pre><code>aaa\n```\n</code></pre>",
   121  		},
   122  		"0.28-gfm-94": {
   123  			Markdown:     "~~~~\naaa\n~~~\n~~~~",
   124  			ExpectedHTML: "<pre><code>aaa\n~~~\n</code></pre>",
   125  		},
   126  		"0.28-gfm-95": {
   127  			Markdown:     "```",
   128  			ExpectedHTML: "<pre><code></code></pre>",
   129  		},
   130  		"0.28-gfm-96": {
   131  			Markdown:     "`````\n\n```\naaa",
   132  			ExpectedHTML: "<pre><code>\n```\naaa</code></pre>",
   133  		},
   134  		"0.28-gfm-97": {
   135  			Markdown:     "> ```\n> aaa\n\nbbb",
   136  			ExpectedHTML: "<blockquote><pre><code>aaa\n</code></pre></blockquote><p>bbb</p>",
   137  		},
   138  		"0.28-gfm-98": {
   139  			Markdown:     "```\n\n  \n```",
   140  			ExpectedHTML: "<pre><code>\n  \n</code></pre>",
   141  		},
   142  		"0.28-gfm-99": {
   143  			Markdown:     "```\n```",
   144  			ExpectedHTML: "<pre><code></code></pre>",
   145  		},
   146  		"0.28-gfm-100": {
   147  			Markdown:     " ```\n aaa\naaa\n```",
   148  			ExpectedHTML: "<pre><code>aaa\naaa\n</code></pre>",
   149  		},
   150  		"0.28-gfm-101": {
   151  			Markdown:     "  ```\naaa\n  aaa\naaa\n  ```",
   152  			ExpectedHTML: "<pre><code>aaa\naaa\naaa\n</code></pre>",
   153  		},
   154  		"0.28-gfm-102": {
   155  			Markdown:     "   ```\n   aaa\n    aaa\n  aaa\n   ```",
   156  			ExpectedHTML: "<pre><code>aaa\n aaa\naaa\n</code></pre>",
   157  		},
   158  		"0.28-gfm-103": {
   159  			Markdown:     "    ```\n    aaa\n    ```",
   160  			ExpectedHTML: "<pre><code>```\naaa\n```</code></pre>",
   161  		},
   162  		"0.28-gfm-104": {
   163  			Markdown:     "```\naaa\n  ```",
   164  			ExpectedHTML: "<pre><code>aaa\n</code></pre>",
   165  		},
   166  		"0.28-gfm-105": {
   167  			Markdown:     "   ```\naaa\n  ```",
   168  			ExpectedHTML: "<pre><code>aaa\n</code></pre>",
   169  		},
   170  		"0.28-gfm-106": {
   171  			Markdown:     "```\naaa\n    ```",
   172  			ExpectedHTML: "<pre><code>aaa\n    ```</code></pre>",
   173  		},
   174  		"0.28-gfm-108": {
   175  			Markdown:     "~~~~~~\naaa\n~~~ ~~",
   176  			ExpectedHTML: "<pre><code>aaa\n~~~ ~~</code></pre>",
   177  		},
   178  		"0.28-gfm-109": {
   179  			Markdown:     "foo\n```\nbar\n```\nbaz",
   180  			ExpectedHTML: "<p>foo</p><pre><code>bar\n</code></pre><p>baz</p>",
   181  		},
   182  		"0.28-gfm-111": {
   183  			Markdown:     "```ruby\ndef foo(x)\n  return 3\nend\n```",
   184  			ExpectedHTML: "<pre><code class=\"language-ruby\">def foo(x)\n  return 3\nend\n</code></pre>",
   185  		},
   186  		"0.28-gfm-112": {
   187  			Markdown:     "```ruby startline=3 $%@#$\ndef foo(x)\n  return 3\nend\n```",
   188  			ExpectedHTML: "<pre><code class=\"language-ruby\">def foo(x)\n  return 3\nend\n</code></pre>",
   189  		},
   190  		"0.28-gfm-113": {
   191  			Markdown:     "````;\n````",
   192  			ExpectedHTML: "<pre><code class=\"language-;\"></code></pre>",
   193  		},
   194  		"0.28-gfm-115": {
   195  			Markdown:     "```\n``` aaa\n```",
   196  			ExpectedHTML: "<pre><code>``` aaa\n</code></pre>",
   197  		},
   198  		"0.28-gfm-159": {
   199  			Markdown:     "[foo]: /url \"title\"\n\n[foo]",
   200  			ExpectedHTML: `<p><a href="/url" title="title">foo</a></p>`,
   201  		},
   202  		"0.28-gfm-160": {
   203  			Markdown:     "   [foo]: \n      /url  \n           'the title'  \n\n[foo]",
   204  			ExpectedHTML: `<p><a href="/url" title="the title">foo</a></p>`,
   205  		},
   206  		"0.28-gfm-161": {
   207  			Markdown:     "[Foo*bar\\]]:my_(url) 'title (with parens)'\n\n[Foo*bar\\]]",
   208  			ExpectedHTML: `<p><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p>`,
   209  		},
   210  		"0.28-gfm-162": {
   211  			Markdown:     "[Foo bar]:\n<my%20url>\n'title'\n\n[Foo bar]",
   212  			ExpectedHTML: `<p><a href="my%20url" title="title">Foo bar</a></p>`,
   213  		},
   214  		"0.28-gfm-163": {
   215  			Markdown:     "[foo]: /url '\ntitle\nline1\nline2\n'\n\n[foo]",
   216  			ExpectedHTML: "<p><a href=\"/url\" title=\"\ntitle\nline1\nline2\n\">foo</a></p>",
   217  		},
   218  		"0.28-gfm-164": {
   219  			Markdown:     "[foo]: /url 'title\n\nwith blank line'\n\n[foo]",
   220  			ExpectedHTML: "<p>[foo]: /url 'title</p><p>with blank line'</p><p>[foo]</p>",
   221  		},
   222  		"0.28-gfm-165": {
   223  			Markdown:     "[foo]:\n/url\n\n[foo]",
   224  			ExpectedHTML: `<p><a href="/url">foo</a></p>`,
   225  		},
   226  		"0.28-gfm-166": {
   227  			Markdown:     "[foo]:\n\n[foo]",
   228  			ExpectedHTML: `<p>[foo]:</p><p>[foo]</p>`,
   229  		},
   230  		"0.28-gfm-167": {
   231  			Markdown:     "[foo]: /url\\bar\\*baz \"foo\\\"bar\\baz\"\n\n[foo]",
   232  			ExpectedHTML: `<p><a href="/url%5Cbar*baz" title="foo&quot;bar\baz">foo</a></p>`,
   233  		},
   234  		"0.28-gfm-168": {
   235  			Markdown:     "[foo]\n\n[foo]: url",
   236  			ExpectedHTML: `<p><a href="url">foo</a></p>`,
   237  		},
   238  		"0.28-gfm-169": {
   239  			Markdown:     "[foo]\n\n[foo]: first\n[foo]: second",
   240  			ExpectedHTML: `<p><a href="first">foo</a></p>`,
   241  		},
   242  		"0.28-gfm-170": {
   243  			Markdown:     "[FOO]: /url\n\n[Foo]",
   244  			ExpectedHTML: `<p><a href="/url">Foo</a></p>`,
   245  		},
   246  		"0.28-gfm-171": {
   247  			Markdown:     "[ΑΓΩ]: /φου\n\n[αγω]",
   248  			ExpectedHTML: `<p><a href="/%CF%86%CE%BF%CF%85">αγω</a></p>`,
   249  		},
   250  		"0.28-gfm-172": {
   251  			Markdown:     "[foo]: /url",
   252  			ExpectedHTML: ``,
   253  		},
   254  		"0.28-gfm-173": {
   255  			Markdown:     "[\nfoo\n]: /url\nbar",
   256  			ExpectedHTML: `<p>bar</p>`,
   257  		},
   258  		"0.28-gfm-174": {
   259  			Markdown:     `[foo]: /url "title" ok`,
   260  			ExpectedHTML: `<p>[foo]: /url &quot;title&quot; ok</p>`,
   261  		},
   262  		"0.28-gfm-175": {
   263  			Markdown:     "[foo]: /url\n\"title\" ok",
   264  			ExpectedHTML: `<p>&quot;title&quot; ok</p>`,
   265  		},
   266  		"0.28-gfm-176": {
   267  			Markdown:     "    [foo]: /url \"title\"\n\n[foo]",
   268  			ExpectedHTML: "<pre><code>[foo]: /url &quot;title&quot;\n</code></pre><p>[foo]</p>",
   269  		},
   270  		"0.28-gfm-177": {
   271  			Markdown:     "```\n[foo]: /url\n```\n\n[foo]",
   272  			ExpectedHTML: "<pre><code>[foo]: /url\n</code></pre><p>[foo]</p>",
   273  		},
   274  		"0.28-gfm-178": {
   275  			Markdown:     "Foo\n[bar]: /baz\n\n[bar]",
   276  			ExpectedHTML: "<p>Foo\n[bar]: /baz</p><p>[bar]</p>",
   277  		},
   278  		"0.28-gfm-180": {
   279  			Markdown: "[foo]: /foo-url \"foo\"\n[bar]: /bar-url\n\"bar\"\n[baz]: /baz-url\n\n[foo],\n[bar],\n[baz]",
   280  			ExpectedHTML: `<p><a href="/foo-url" title="foo">foo</a>,
   281  <a href="/bar-url" title="bar">bar</a>,
   282  <a href="/baz-url">baz</a></p>`,
   283  		},
   284  		"0.28-gfm-181": {
   285  			Markdown:     "[foo]\n\n> [foo]: /url",
   286  			ExpectedHTML: `<p><a href="/url">foo</a></p><blockquote></blockquote>`,
   287  		},
   288  		"0.28-gfm-182": {
   289  			Markdown:     "aaa\n\nbbb",
   290  			ExpectedHTML: "<p>aaa</p><p>bbb</p>",
   291  		},
   292  		"0.28-gfm-183": {
   293  			Markdown:     "aaa\nbbb\n\nccc\nddd",
   294  			ExpectedHTML: "<p>aaa\nbbb</p><p>ccc\nddd</p>",
   295  		},
   296  		"0.28-gfm-184": {
   297  			Markdown:     "aaa\n\n\nbbb",
   298  			ExpectedHTML: "<p>aaa</p><p>bbb</p>",
   299  		},
   300  		"0.28-gfm-185": {
   301  			Markdown:     "  aaa\n bbb",
   302  			ExpectedHTML: "<p>aaa\nbbb</p>",
   303  		},
   304  		"0.28-gfm-186": {
   305  			Markdown:     "aaa\n             bbb\n                                       ccc",
   306  			ExpectedHTML: "<p>aaa\nbbb\nccc</p>",
   307  		},
   308  		"0.28-gfm-187": {
   309  			Markdown:     "   aaa\nbbb",
   310  			ExpectedHTML: "<p>aaa\nbbb</p>",
   311  		},
   312  		"0.28-gfm-188": {
   313  			Markdown:     "    aaa\nbbb",
   314  			ExpectedHTML: "<pre><code>aaa\n</code></pre><p>bbb</p>",
   315  		},
   316  		"0.28-gfm-189": {
   317  			Markdown:     "aaa     \nbbb     \n",
   318  			ExpectedHTML: "<p>aaa<br />bbb</p>",
   319  		},
   320  		"0.28-gfm-204": {
   321  			Markdown:     "> bar\nbaz\n> foo",
   322  			ExpectedHTML: "<blockquote><p>bar\nbaz\nfoo</p></blockquote>",
   323  		},
   324  		"0.28-gfm-206": {
   325  			Markdown:     "> - foo\n- bar",
   326  			ExpectedHTML: "<blockquote><ul><li>foo</li></ul></blockquote><ul><li>bar</li></ul>",
   327  		},
   328  		"0.28-gfm-207": {
   329  			Markdown:     ">     foo\n    bar",
   330  			ExpectedHTML: "<blockquote><pre><code>foo\n</code></pre></blockquote><pre><code>bar</code></pre>",
   331  		},
   332  		"0.28-gfm-208": {
   333  			Markdown:     "> ```\nfoo\n```",
   334  			ExpectedHTML: "<blockquote><pre><code></code></pre></blockquote><p>foo</p><pre><code></code></pre>",
   335  		},
   336  		"0.28-gfm-209": {
   337  			Markdown:     "> foo\n    - bar",
   338  			ExpectedHTML: "<blockquote><p>foo\n- bar</p></blockquote>",
   339  		},
   340  		"0.28-gfm-210": {
   341  			Markdown:     ">",
   342  			ExpectedHTML: "<blockquote></blockquote>",
   343  		},
   344  		"0.28-gfm-211": {
   345  			Markdown:     ">\n>  \n> ",
   346  			ExpectedHTML: "<blockquote></blockquote>",
   347  		},
   348  		"0.28-gfm-212": {
   349  			Markdown:     ">\n> foo\n>  ",
   350  			ExpectedHTML: "<blockquote><p>foo</p></blockquote>",
   351  		},
   352  		"0.28-gfm-213": {
   353  			Markdown:     "> foo\n\n> bar",
   354  			ExpectedHTML: "<blockquote><p>foo</p></blockquote><blockquote><p>bar</p></blockquote>",
   355  		},
   356  		"0.28-gfm-214": {
   357  			Markdown:     "> foo\n> bar",
   358  			ExpectedHTML: "<blockquote><p>foo\nbar</p></blockquote>",
   359  		},
   360  		"0.28-gfm-215": {
   361  			Markdown:     "> foo\n>\n> bar",
   362  			ExpectedHTML: "<blockquote><p>foo</p><p>bar</p></blockquote>",
   363  		},
   364  		"0.28-gfm-216": {
   365  			Markdown:     "foo\n> bar",
   366  			ExpectedHTML: "<p>foo</p><blockquote><p>bar</p></blockquote>",
   367  		},
   368  		"0.28-gfm-218": {
   369  			Markdown:     "> bar\nbaz",
   370  			ExpectedHTML: "<blockquote><p>bar\nbaz</p></blockquote>",
   371  		},
   372  		"0.28-gfm-219": {
   373  			Markdown:     "> bar\n\nbaz",
   374  			ExpectedHTML: "<blockquote><p>bar</p></blockquote><p>baz</p>",
   375  		},
   376  		"0.28-gfm-220": {
   377  			Markdown:     "> bar\n>\nbaz",
   378  			ExpectedHTML: "<blockquote><p>bar</p></blockquote><p>baz</p>",
   379  		},
   380  		"0.28-gfm-221": {
   381  			Markdown:     "> > > foo\nbar",
   382  			ExpectedHTML: "<blockquote><blockquote><blockquote><p>foo\nbar</p></blockquote></blockquote></blockquote>",
   383  		},
   384  		"0.28-gfm-222": {
   385  			Markdown:     ">>> foo\n> bar\n>>baz",
   386  			ExpectedHTML: "<blockquote><blockquote><blockquote><p>foo\nbar\nbaz</p></blockquote></blockquote></blockquote>",
   387  		},
   388  		"0.28-gfm-223": {
   389  			Markdown:     ">     code\n\n>    not code",
   390  			ExpectedHTML: "<blockquote><pre><code>code\n</code></pre></blockquote><blockquote><p>not code</p></blockquote>",
   391  		},
   392  		"0.28-gfm-224": {
   393  			Markdown:     "A paragraph\nwith two lines.\n\n    indented code\n\n> A block quote.",
   394  			ExpectedHTML: "<p>A paragraph\nwith two lines.</p><pre><code>indented code\n</code></pre><blockquote><p>A block quote.</p></blockquote>",
   395  		},
   396  		"0.28-gfm-225": {
   397  			Markdown:     "1.  A paragraph\n    with two lines.\n\n        indented code\n\n    > A block quote.",
   398  			ExpectedHTML: "<ol><li><p>A paragraph\nwith two lines.</p><pre><code>indented code\n</code></pre><blockquote><p>A block quote.</p></blockquote></li></ol>",
   399  		},
   400  		"0.28-gfm-226": {
   401  			Markdown:     "- one\n\n two",
   402  			ExpectedHTML: "<ul><li>one</li></ul><p>two</p>",
   403  		},
   404  		"0.28-gfm-227": {
   405  			Markdown:     "- one\n\n  two",
   406  			ExpectedHTML: "<ul><li><p>one</p><p>two</p></li></ul>",
   407  		},
   408  		"0.28-gfm-228": {
   409  			Markdown:     " -    one\n\n     two",
   410  			ExpectedHTML: "<ul><li>one</li></ul><pre><code> two</code></pre>",
   411  		},
   412  		"0.28-gfm-229": {
   413  			Markdown:     " -    one\n\n      two",
   414  			ExpectedHTML: "<ul><li><p>one</p><p>two</p></li></ul>",
   415  		},
   416  		"0.28-gfm-230": {
   417  			Markdown:     "   > > 1.  one\n>>\n>>     two",
   418  			ExpectedHTML: "<blockquote><blockquote><ol><li><p>one</p><p>two</p></li></ol></blockquote></blockquote>",
   419  		},
   420  		"0.28-gfm-231": {
   421  			Markdown:     ">>- one\n>>\n  >  > two",
   422  			ExpectedHTML: "<blockquote><blockquote><ul><li>one</li></ul><p>two</p></blockquote></blockquote>",
   423  		},
   424  		"0.28-gfm-232": {
   425  			Markdown:     "-one\n\n2.two",
   426  			ExpectedHTML: "<p>-one</p><p>2.two</p>",
   427  		},
   428  		"0.28-gfm-233": {
   429  			Markdown:     "- foo\n\n\n  bar",
   430  			ExpectedHTML: "<ul><li><p>foo</p><p>bar</p></li></ul>",
   431  		},
   432  		"0.28-gfm-234": {
   433  			Markdown:     "1.  foo\n\n    ```\n    bar\n    ```\n\n    baz\n\n    > bam",
   434  			ExpectedHTML: "<ol><li><p>foo</p><pre><code>bar\n</code></pre><p>baz</p><blockquote><p>bam</p></blockquote></li></ol>",
   435  		},
   436  		"0.28-gfm-235": {
   437  			Markdown:     "- Foo\n\n      bar\n\n\n      baz",
   438  			ExpectedHTML: "<ul><li><p>Foo</p><pre><code>bar\n\n\nbaz</code></pre></li></ul>",
   439  		},
   440  		"0.28-gfm-236": {
   441  			Markdown:     "123456789. ok",
   442  			ExpectedHTML: `<ol start="123456789"><li>ok</li></ol>`,
   443  		},
   444  		"0.28-gfm-237": {
   445  			Markdown:     "1234567890. not ok",
   446  			ExpectedHTML: "<p>1234567890. not ok</p>",
   447  		},
   448  		"0.28-gfm-238": {
   449  			Markdown:     "0. ok",
   450  			ExpectedHTML: `<ol start="0"><li>ok</li></ol>`,
   451  		},
   452  		"0.28-gfm-239": {
   453  			Markdown:     "003. ok",
   454  			ExpectedHTML: `<ol start="3"><li>ok</li></ol>`,
   455  		},
   456  		"0.28-gfm-240": {
   457  			Markdown:     "-1. not ok",
   458  			ExpectedHTML: "<p>-1. not ok</p>",
   459  		},
   460  		"0.28-gfm-241": {
   461  			Markdown:     "- foo\n\n      bar",
   462  			ExpectedHTML: "<ul><li><p>foo</p><pre><code>bar</code></pre></li></ul>",
   463  		},
   464  		"0.28-gfm-242": {
   465  			Markdown:     "  10.  foo\n\n           bar",
   466  			ExpectedHTML: `<ol start="10"><li><p>foo</p><pre><code>bar</code></pre></li></ol>`,
   467  		},
   468  		"0.28-gfm-243": {
   469  			Markdown:     "    indented code\n\nparagraph\n\n    more code",
   470  			ExpectedHTML: "<pre><code>indented code\n</code></pre><p>paragraph</p><pre><code>more code</code></pre>",
   471  		},
   472  		"0.28-gfm-244": {
   473  			Markdown:     "1.     indented code\n\n   paragraph\n\n       more code",
   474  			ExpectedHTML: "<ol><li><pre><code>indented code\n</code></pre><p>paragraph</p><pre><code>more code</code></pre></li></ol>",
   475  		},
   476  		"0.28-gfm-245": {
   477  			Markdown:     "1.      indented code\n\n   paragraph\n\n       more code",
   478  			ExpectedHTML: "<ol><li><pre><code> indented code\n</code></pre><p>paragraph</p><pre><code>more code</code></pre></li></ol>",
   479  		},
   480  		"0.28-gfm-246": {
   481  			Markdown:     "   foo\n\nbar",
   482  			ExpectedHTML: "<p>foo</p><p>bar</p>",
   483  		},
   484  		"0.28-gfm-247": {
   485  			Markdown:     "-    foo\n\n  bar",
   486  			ExpectedHTML: "<ul><li>foo</li></ul><p>bar</p>",
   487  		},
   488  		"0.28-gfm-248": {
   489  			Markdown:     "-  foo\n\n   bar",
   490  			ExpectedHTML: "<ul><li><p>foo</p><p>bar</p></li></ul>",
   491  		},
   492  		"0.28-gfm-249": {
   493  			Markdown:     "-\n  foo\n-\n  ```\n  bar\n  ```\n-\n      baz",
   494  			ExpectedHTML: "<ul><li>foo</li><li><pre><code>bar\n</code></pre></li><li><pre><code>baz</code></pre></li></ul>",
   495  		},
   496  		"0.28-gfm-250": {
   497  			Markdown:     "-   \n  foo",
   498  			ExpectedHTML: "<ul><li>foo</li></ul>",
   499  		},
   500  		"0.28-gfm-251": {
   501  			Markdown:     "-\n\n  foo",
   502  			ExpectedHTML: "<ul><li></li></ul><p>foo</p>",
   503  		},
   504  		"0.28-gfm-252": {
   505  			Markdown:     "- foo\n-\n- bar",
   506  			ExpectedHTML: "<ul><li>foo</li><li></li><li>bar</li></ul>",
   507  		},
   508  		"0.28-gfm-253": {
   509  			Markdown:     "- foo\n-   \n- bar",
   510  			ExpectedHTML: "<ul><li>foo</li><li></li><li>bar</li></ul>",
   511  		},
   512  		"0.28-gfm-254": {
   513  			Markdown:     "1. foo\n2.\n3. bar",
   514  			ExpectedHTML: "<ol><li>foo</li><li></li><li>bar</li></ol>",
   515  		},
   516  		"0.28-gfm-255": {
   517  			Markdown:     "*",
   518  			ExpectedHTML: "<ul><li></li></ul>",
   519  		},
   520  		"0.28-gfm-256": {
   521  			Markdown:     "foo\n*\n\nfoo\n1.",
   522  			ExpectedHTML: "<p>foo\n*</p><p>foo\n1.</p>",
   523  		},
   524  		"0.28-gfm-257": {
   525  			Markdown:     " 1.  A paragraph\n     with two lines.\n\n         indented code\n\n     > A block quote.",
   526  			ExpectedHTML: "<ol><li><p>A paragraph\nwith two lines.</p><pre><code>indented code\n</code></pre><blockquote><p>A block quote.</p></blockquote></li></ol>",
   527  		},
   528  		"0.28-gfm-258": {
   529  			Markdown:     "  1.  A paragraph\n      with two lines.\n\n          indented code\n\n      > A block quote.",
   530  			ExpectedHTML: "<ol><li><p>A paragraph\nwith two lines.</p><pre><code>indented code\n</code></pre><blockquote><p>A block quote.</p></blockquote></li></ol>",
   531  		},
   532  		"0.28-gfm-259": {
   533  			Markdown:     "   1.  A paragraph\n       with two lines.\n\n           indented code\n\n       > A block quote.",
   534  			ExpectedHTML: "<ol><li><p>A paragraph\nwith two lines.</p><pre><code>indented code\n</code></pre><blockquote><p>A block quote.</p></blockquote></li></ol>",
   535  		},
   536  		"0.28-gfm-260": {
   537  			Markdown:     "    1.  A paragraph\n        with two lines.\n\n            indented code\n\n        > A block quote.",
   538  			ExpectedHTML: "<pre><code>1.  A paragraph\n    with two lines.\n\n        indented code\n\n    &gt; A block quote.</code></pre>",
   539  		},
   540  		"0.28-gfm-261": {
   541  			Markdown:     "  1.  A paragraph\nwith two lines.\n\n          indented code\n\n      > A block quote.",
   542  			ExpectedHTML: "<ol><li><p>A paragraph\nwith two lines.</p><pre><code>indented code\n</code></pre><blockquote><p>A block quote.</p></blockquote></li></ol>",
   543  		},
   544  		"0.28-gfm-262": {
   545  			Markdown:     "  1.  A paragraph\n    with two lines.",
   546  			ExpectedHTML: "<ol><li>A paragraph\nwith two lines.</li></ol>",
   547  		},
   548  		"0.28-gfm-263": {
   549  			Markdown:     "> 1. > Blockquote\ncontinued here.",
   550  			ExpectedHTML: "<blockquote><ol><li><blockquote><p>Blockquote\ncontinued here.</p></blockquote></li></ol></blockquote>",
   551  		},
   552  		"0.28-gfm-264": {
   553  			Markdown:     "> 1. > Blockquote\n> continued here.",
   554  			ExpectedHTML: "<blockquote><ol><li><blockquote><p>Blockquote\ncontinued here.</p></blockquote></li></ol></blockquote>",
   555  		},
   556  		"0.28-gfm-265": {
   557  			Markdown:     "- foo\n  - bar\n    - baz\n      - boo",
   558  			ExpectedHTML: "<ul><li>foo<ul><li>bar<ul><li>baz<ul><li>boo</li></ul></li></ul></li></ul></li></ul>",
   559  		},
   560  		"0.28-gfm-266": {
   561  			Markdown:     "- foo\n - bar\n  - baz\n   - boo",
   562  			ExpectedHTML: "<ul><li>foo</li><li>bar</li><li>baz</li><li>boo</li></ul>",
   563  		},
   564  		"0.28-gfm-267": {
   565  			Markdown:     "10) foo\n    - bar",
   566  			ExpectedHTML: `<ol start="10"><li>foo<ul><li>bar</li></ul></li></ol>`,
   567  		},
   568  		"0.28-gfm-268": {
   569  			Markdown:     "10) foo\n   - bar",
   570  			ExpectedHTML: `<ol start="10"><li>foo</li></ol><ul><li>bar</li></ul>`,
   571  		},
   572  		"0.28-gfm-269": {
   573  			Markdown:     "- - foo",
   574  			ExpectedHTML: "<ul><li><ul><li>foo</li></ul></li></ul>",
   575  		},
   576  		"0.28-gfm-270": {
   577  			Markdown:     "1. - 2. foo",
   578  			ExpectedHTML: `<ol><li><ul><li><ol start="2"><li>foo</li></ol></li></ul></li></ol>`,
   579  		},
   580  		"0.28-gfm-274": {
   581  			Markdown:     "- foo\n- bar\n+ baz",
   582  			ExpectedHTML: "<ul><li>foo</li><li>bar</li></ul><ul><li>baz</li></ul>",
   583  		},
   584  		"0.28-gfm-275": {
   585  			Markdown:     "1. foo\n2. bar\n3) baz",
   586  			ExpectedHTML: `<ol><li>foo</li><li>bar</li></ol><ol start="3"><li>baz</li></ol>`,
   587  		},
   588  		"0.28-gfm-276": {
   589  			Markdown:     "Foo\n- bar\n- baz",
   590  			ExpectedHTML: "<p>Foo</p><ul><li>bar</li><li>baz</li></ul>",
   591  		},
   592  		"0.28-gfm-277": {
   593  			Markdown:     "The number of windows in my house is\n14.  The number of doors is 6.",
   594  			ExpectedHTML: "<p>The number of windows in my house is\n14.  The number of doors is 6.</p>",
   595  		},
   596  		"0.28-gfm-278": {
   597  			Markdown:     "The number of windows in my house is\n1.  The number of doors is 6.",
   598  			ExpectedHTML: "<p>The number of windows in my house is</p><ol><li>The number of doors is 6.</li></ol>",
   599  		},
   600  		"0.28-gfm-279": {
   601  			Markdown:     "- foo\n\n- bar\n\n\n- baz",
   602  			ExpectedHTML: "<ul><li><p>foo</p></li><li><p>bar</p></li><li><p>baz</p></li></ul>",
   603  		},
   604  		"0.28-gfm-280": {
   605  			Markdown:     "- foo\n  - bar\n    - baz\n\n\n      bim",
   606  			ExpectedHTML: "<ul><li>foo<ul><li>bar<ul><li><p>baz</p><p>bim</p></li></ul></li></ul></li></ul>",
   607  		},
   608  		"0.28-gfm-283": {
   609  			Markdown:     "- a\n - b\n  - c\n   - d\n    - e\n   - f\n  - g\n - h\n- i",
   610  			ExpectedHTML: "<ul><li>a</li><li>b</li><li>c</li><li>d</li><li>e</li><li>f</li><li>g</li><li>h</li><li>i</li></ul>",
   611  		},
   612  		"0.28-gfm-284": {
   613  			Markdown:     "1. a\n\n  2. b\n\n    3. c",
   614  			ExpectedHTML: "<ol><li><p>a</p></li><li><p>b</p></li><li><p>c</p></li></ol>",
   615  		},
   616  		"0.28-gfm-285": {
   617  			Markdown:     "- a\n- b\n\n- c",
   618  			ExpectedHTML: "<ul><li><p>a</p></li><li><p>b</p></li><li><p>c</p></li></ul>",
   619  		},
   620  		"0.28-gfm-286": {
   621  			Markdown:     "* a\n*\n\n* c",
   622  			ExpectedHTML: "<ul><li><p>a</p></li><li></li><li><p>c</p></li></ul>",
   623  		},
   624  		"0.28-gfm-287": {
   625  			Markdown:     "- a\n- b\n\n  c\n- d",
   626  			ExpectedHTML: "<ul><li><p>a</p></li><li><p>b</p><p>c</p></li><li><p>d</p></li></ul>",
   627  		},
   628  		"0.28-gfm-288": {
   629  			Markdown:     "- a\n- b\n\n  [ref]: /url\n- d",
   630  			ExpectedHTML: "<ul><li><p>a</p></li><li><p>b</p></li><li><p>d</p></li></ul>",
   631  		},
   632  		"0.28-gfm-289": {
   633  			Markdown:     "- a\n- ```\n  b\n\n\n  ```\n- c",
   634  			ExpectedHTML: "<ul><li>a</li><li><pre><code>b\n\n\n</code></pre></li><li>c</li></ul>",
   635  		},
   636  		"0.28-gfm-290": {
   637  			Markdown:     "- a\n  - b\n\n    c\n- d",
   638  			ExpectedHTML: "<ul><li>a<ul><li><p>b</p><p>c</p></li></ul></li><li>d</li></ul>",
   639  		},
   640  		"0.28-gfm-291": {
   641  			Markdown:     "* a\n  > b\n  >\n* c",
   642  			ExpectedHTML: "<ul><li>a<blockquote><p>b</p></blockquote></li><li>c</li></ul>",
   643  		},
   644  		"0.28-gfm-292": {
   645  			Markdown:     "- a\n  > b\n  ```\n  c\n  ```\n- d",
   646  			ExpectedHTML: "<ul><li>a<blockquote><p>b</p></blockquote><pre><code>c\n</code></pre></li><li>d</li></ul>",
   647  		},
   648  		"0.28-gfm-293": {
   649  			Markdown:     "- a",
   650  			ExpectedHTML: "<ul><li>a</li></ul>",
   651  		},
   652  		"0.28-gfm-294": {
   653  			Markdown:     "- a\n  - b",
   654  			ExpectedHTML: "<ul><li>a<ul><li>b</li></ul></li></ul>",
   655  		},
   656  		"0.28-gfm-295": {
   657  			Markdown:     "1. ```\n   foo\n   ```\n\n   bar",
   658  			ExpectedHTML: "<ol><li><pre><code>foo\n</code></pre><p>bar</p></li></ol>",
   659  		},
   660  		"0.28-gfm-296": {
   661  			Markdown:     "* foo\n  * bar\n\n  baz",
   662  			ExpectedHTML: "<ul><li><p>foo</p><ul><li>bar</li></ul><p>baz</p></li></ul>",
   663  		},
   664  		"0.28-gfm-297": {
   665  			Markdown:     "- a\n  - b\n  - c\n\n- d\n  - e\n  - f",
   666  			ExpectedHTML: "<ul><li><p>a</p><ul><li>b</li><li>c</li></ul></li><li><p>d</p><ul><li>e</li><li>f</li></ul></li></ul>",
   667  		},
   668  		"0.28-gfm-298": {
   669  			Markdown:     "`hi`lo`",
   670  			ExpectedHTML: "<p><code>hi</code>lo`</p>",
   671  		},
   672  		"0.28-gfm-299": {
   673  			Markdown:     `\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_` + "\\`" + `\{\|\}\~`,
   674  			ExpectedHTML: "<p>!&quot;#$%&amp;'()*+,-./:;&lt;=&gt;?@[\\]^_`{|}~</p>",
   675  		},
   676  		"0.28-gfm-300": {
   677  			Markdown:     `\→\A\a\ \3\φ\«`,
   678  			ExpectedHTML: `<p>\→\A\a\ \3\φ\«</p>`,
   679  		},
   680  		"0.28-gfm-301": {
   681  			Markdown: `\*not emphasized*
   682  \<br/> not a tag
   683  \[not a link](/foo)
   684  \` + "`not code`" + `
   685  1\. not a list
   686  \* not a list
   687  \# not a heading
   688  \[foo]: /url "not a reference"`,
   689  			ExpectedHTML: `<p>*not emphasized*
   690  &lt;br/&gt; not a tag
   691  [not a link](/foo)
   692  ` + "`not code`" + `
   693  1. not a list
   694  * not a list
   695  # not a heading
   696  [foo]: /url &quot;not a reference&quot;</p>`,
   697  		},
   698  		"0.28-gfm-304": {
   699  			Markdown:     "`` \\[\\` ``",
   700  			ExpectedHTML: "<p><code>\\[\\`</code></p>",
   701  		},
   702  		"0.28-gfm-305": {
   703  			Markdown:     `    \[\]`,
   704  			ExpectedHTML: `<pre><code>\[\]</code></pre>`,
   705  		},
   706  		"0.28-gfm-306": {
   707  			Markdown:     "~~~\n\\[\\]\n~~~",
   708  			ExpectedHTML: "<pre><code>\\[\\]\n</code></pre>",
   709  		},
   710  		"0.28-gfm-309": {
   711  			Markdown:     `[foo](/bar\* "ti\*tle")`,
   712  			ExpectedHTML: `<p><a href="/bar*" title="ti*tle">foo</a></p>`,
   713  		},
   714  		"0.28-gfm-310": {
   715  			Markdown: `[foo]
   716  
   717  [foo]: /bar\* "ti\*tle"`,
   718  			ExpectedHTML: `<p><a href="/bar*" title="ti*tle">foo</a></p>`,
   719  		},
   720  		"0.28-gfm-311": {
   721  			Markdown:     "``` foo\\+bar\nfoo\n```",
   722  			ExpectedHTML: "<pre><code class=\"language-foo+bar\">foo\n</code></pre>",
   723  		},
   724  		"0.28-gfm-312": {
   725  			Markdown:     "&nbsp; &amp; &copy; &AElig; &Dcaron;\n&frac34; &HilbertSpace; &DifferentialD;\n&ClockwiseContourIntegral; &ngE;",
   726  			ExpectedHTML: "<p>\u00a0 &amp; © Æ Ď\n¾ ℋ ⅆ\n∲ ≧̸</p>",
   727  		},
   728  		"0.28-gfm-313": {
   729  			Markdown:     "&#35; &#1234; &#992; &#98765432; &#0;",
   730  			ExpectedHTML: "<p># Ӓ Ϡ � �</p>",
   731  		},
   732  		"0.28-gfm-314": {
   733  			Markdown:     "&#X22; &#XD06; &#xcab;",
   734  			ExpectedHTML: "<p>&quot; ആ ಫ</p>",
   735  		},
   736  		"0.28-gfm-315": {
   737  			Markdown:     "&nbsp &x; &#; &#x;\n&ThisIsNotDefined; &hi?;",
   738  			ExpectedHTML: "<p>&amp;nbsp &amp;x; &amp;#; &amp;#x;\n&amp;ThisIsNotDefined; &amp;hi?;</p>",
   739  		},
   740  		"0.28-gfm-316": {
   741  			Markdown:     "&copy",
   742  			ExpectedHTML: "<p>&amp;copy</p>",
   743  		},
   744  		"0.28-gfm-317": {
   745  			Markdown:     "&MadeUpEntity;",
   746  			ExpectedHTML: "<p>&amp;MadeUpEntity;</p>",
   747  		},
   748  		"0.28-gfm-319": {
   749  			Markdown:     `[foo](/f&ouml;&ouml; "f&ouml;&ouml;")`,
   750  			ExpectedHTML: `<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>`,
   751  		},
   752  		"0.28-gfm-320": {
   753  			Markdown:     "[foo]\n\n[foo]: /f&ouml;&ouml; \"f&ouml;&ouml;\"",
   754  			ExpectedHTML: `<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>`,
   755  		},
   756  		"0.28-gfm-321": {
   757  			Markdown:     "``` f&ouml;&ouml;\nfoo\n```",
   758  			ExpectedHTML: "<pre><code class=\"language-föö\">foo\n</code></pre>",
   759  		},
   760  		"0.28-gfm-322": {
   761  			Markdown:     "`f&ouml;&ouml;`",
   762  			ExpectedHTML: "<p><code>f&amp;ouml;&amp;ouml;</code></p>",
   763  		},
   764  		"0.28-gfm-323": {
   765  			Markdown:     "    f&ouml;f&ouml;",
   766  			ExpectedHTML: "<pre><code>f&amp;ouml;f&amp;ouml;</code></pre>",
   767  		},
   768  		"0.28-gfm-324": {
   769  			Markdown:     "`foo`",
   770  			ExpectedHTML: "<p><code>foo</code></p>",
   771  		},
   772  		"0.28-gfm-325": {
   773  			Markdown:     "`` foo ` bar ``",
   774  			ExpectedHTML: "<p><code>foo ` bar</code></p>",
   775  		},
   776  		"0.28-gfm-326": {
   777  			Markdown:     "` `` `",
   778  			ExpectedHTML: "<p><code>``</code></p>",
   779  		},
   780  		"0.28-gfm-327": {
   781  			Markdown:     "``\nfoo\n``",
   782  			ExpectedHTML: "<p><code>foo</code></p>",
   783  		},
   784  		"0.28-gfm-328": {
   785  			Markdown:     "`foo   bar\n  baz`",
   786  			ExpectedHTML: "<p><code>foo bar baz</code></p>",
   787  		},
   788  		"0.28-gfm-329": {
   789  			Markdown:     "`a\xa0\xa0b`",
   790  			ExpectedHTML: "<p><code>a\xa0\xa0b</code></p>",
   791  		},
   792  		"0.28-gfm-330": {
   793  			Markdown:     "`foo `` bar`",
   794  			ExpectedHTML: "<p><code>foo `` bar</code></p>",
   795  		},
   796  		"0.28-gfm-331": {
   797  			Markdown:     "`foo\\`bar`",
   798  			ExpectedHTML: "<p><code>foo\\</code>bar`</p>",
   799  		},
   800  		"0.28-gfm-332": {
   801  			Markdown:     "*foo`*`",
   802  			ExpectedHTML: "<p>*foo<code>*</code></p>",
   803  		},
   804  		"0.28-gfm-333": {
   805  			Markdown:     "[not a `link](/foo`)",
   806  			ExpectedHTML: "<p>[not a <code>link](/foo</code>)</p>",
   807  		},
   808  		"0.28-gfm-334": {
   809  			Markdown:     "`<a href=\"`\">`",
   810  			ExpectedHTML: "<p><code>&lt;a href=&quot;</code>&quot;&gt;`</p>",
   811  		},
   812  		"0.28-gfm-336": {
   813  			Markdown:     "`<http://foo.bar.`baz>`",
   814  			ExpectedHTML: "<p><code>&lt;http://foo.bar.</code>baz&gt;`</p>",
   815  		},
   816  		"0.28-gfm-338": {
   817  			Markdown:     "```foo``",
   818  			ExpectedHTML: "<p>```foo``</p>",
   819  		},
   820  		"0.28-gfm-339": {
   821  			Markdown:     "`foo",
   822  			ExpectedHTML: "<p>`foo</p>",
   823  		},
   824  		"0.28-gfm-340": {
   825  			Markdown:     "`foo``bar``",
   826  			ExpectedHTML: "<p>`foo<code>bar</code></p>",
   827  		},
   828  		"0.28-gfm-472": {
   829  			Markdown:     `[link](/uri "title")`,
   830  			ExpectedHTML: `<p><a href="/uri" title="title">link</a></p>`,
   831  		},
   832  		"0.28-gfm-473": {
   833  			Markdown:     `[link](/uri)`,
   834  			ExpectedHTML: `<p><a href="/uri">link</a></p>`,
   835  		},
   836  		"0.28-gfm-474": {
   837  			Markdown:     `[link]()`,
   838  			ExpectedHTML: `<p><a href="">link</a></p>`,
   839  		},
   840  		"0.28-gfm-475": {
   841  			Markdown:     `[link](<>)`,
   842  			ExpectedHTML: `<p><a href="">link</a></p>`,
   843  		},
   844  		"0.28-gfm-476": {
   845  			Markdown:     `[link](/my uri)`,
   846  			ExpectedHTML: `<p>[link](/my uri)</p>`,
   847  		},
   848  		"0.28-gfm-477": {
   849  			Markdown:     `[link](</my uri>)`,
   850  			ExpectedHTML: `<p>[link](&lt;/my uri&gt;)</p>`,
   851  		},
   852  		"0.28-gfm-478": {
   853  			Markdown:     "[link](foo\nbar)",
   854  			ExpectedHTML: "<p>[link](foo\nbar)</p>",
   855  		},
   856  		"0.28-gfm-480": {
   857  			Markdown:     `[link](\(foo\))`,
   858  			ExpectedHTML: `<p><a href="(foo)">link</a></p>`,
   859  		},
   860  		"0.28-gfm-481": {
   861  			Markdown:     `[link](foo(and(bar)))`,
   862  			ExpectedHTML: `<p><a href="foo(and(bar))">link</a></p>`,
   863  		},
   864  		"0.28-gfm-482": {
   865  			Markdown:     `[link](foo\(and\(bar\))`,
   866  			ExpectedHTML: `<p><a href="foo(and(bar)">link</a></p>`,
   867  		},
   868  		"0.28-gfm-483": {
   869  			Markdown:     `[link](<foo(and(bar)>)`,
   870  			ExpectedHTML: `<p><a href="foo(and(bar)">link</a></p>`,
   871  		},
   872  		"0.28-gfm-484": {
   873  			Markdown:     `[link](foo\)\:)`,
   874  			ExpectedHTML: `<p><a href="foo):">link</a></p>`,
   875  		},
   876  		"0.28-gfm-485": {
   877  			Markdown:     "[link](#fragment)\n\n[link](http://example.com#fragment)\n\n[link](http://example.com?foo=3#frag)",
   878  			ExpectedHTML: `<p><a href="#fragment">link</a></p><p><a href="http://example.com#fragment">link</a></p><p><a href="http://example.com?foo=3#frag">link</a></p>`,
   879  		},
   880  		"0.28-gfm-486": {
   881  			Markdown:     `[link](foo\bar)`,
   882  			ExpectedHTML: `<p><a href="foo%5Cbar">link</a></p>`,
   883  		},
   884  		"0.28-gfm-488": {
   885  			Markdown:     `[link]("title")`,
   886  			ExpectedHTML: `<p><a href="%22title%22">link</a></p>`,
   887  		},
   888  		"0.28-gfm-489": {
   889  			Markdown:     "[link](/url \"title\")\n[link](/url 'title')\n[link](/url (title))",
   890  			ExpectedHTML: "<p><a href=\"/url\" title=\"title\">link</a>\n<a href=\"/url\" title=\"title\">link</a>\n<a href=\"/url\" title=\"title\">link</a></p>",
   891  		},
   892  		"0.28-gfm-490": {
   893  			Markdown:     `[link](/url "title \"&quot;")`,
   894  			ExpectedHTML: `<p><a href="/url" title="title &quot;&quot;">link</a></p>`,
   895  		},
   896  		"0.28-gfm-491": {
   897  			Markdown:     "[link](/url\u00a0\"title\")",
   898  			ExpectedHTML: `<p><a href="/url%C2%A0%22title%22">link</a></p>`,
   899  		},
   900  		"0.28-gfm-492": {
   901  			Markdown:     `[link](/url "title "and" title")`,
   902  			ExpectedHTML: `<p>[link](/url &quot;title &quot;and&quot; title&quot;)</p>`,
   903  		},
   904  		"0.28-gfm-493": {
   905  			Markdown:     `[link](/url 'title "and" title')`,
   906  			ExpectedHTML: `<p><a href="/url" title="title &quot;and&quot; title">link</a></p>`,
   907  		},
   908  		"0.28-gfm-494": {
   909  			Markdown:     "[link](   /uri\n  \"title\"  )",
   910  			ExpectedHTML: `<p><a href="/uri" title="title">link</a></p>`,
   911  		},
   912  		"0.28-gfm-495": {
   913  			Markdown:     "[link] (/uri)",
   914  			ExpectedHTML: `<p>[link] (/uri)</p>`,
   915  		},
   916  		"0.28-gfm-496": {
   917  			Markdown:     "[link [foo [bar]]](/uri)",
   918  			ExpectedHTML: `<p><a href="/uri">link [foo [bar]]</a></p>`,
   919  		},
   920  		"0.28-gfm-497": {
   921  			Markdown:     "[link] bar](/uri)",
   922  			ExpectedHTML: `<p>[link] bar](/uri)</p>`,
   923  		},
   924  		"0.28-gfm-498": {
   925  			Markdown:     "[link [bar](/uri)",
   926  			ExpectedHTML: `<p>[link <a href="/uri">bar</a></p>`,
   927  		},
   928  		"0.28-gfm-499": {
   929  			Markdown:     `[link \[bar](/uri)`,
   930  			ExpectedHTML: `<p><a href="/uri">link [bar</a></p>`,
   931  		},
   932  		"0.28-gfm-501": {
   933  			Markdown:     "[![moon](moon.jpg)](/uri)",
   934  			ExpectedHTML: `<p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>`,
   935  		},
   936  		"0.28-gfm-502": {
   937  			Markdown:     "[foo [bar](/uri)](/uri)",
   938  			ExpectedHTML: `<p>[foo <a href="/uri">bar</a>](/uri)</p>`,
   939  		},
   940  		"0.28-gfm-504": {
   941  			Markdown:     "![[[foo](uri1)](uri2)](uri3)",
   942  			ExpectedHTML: `<p><img src="uri3" alt="[foo](uri2)" /></p>`,
   943  		},
   944  		"0.28-gfm-505": {
   945  			Markdown:     "*[foo*](/uri)",
   946  			ExpectedHTML: `<p>*<a href="/uri">foo*</a></p>`,
   947  		},
   948  		"0.28-gfm-506": {
   949  			Markdown:     "[foo *bar](baz*)",
   950  			ExpectedHTML: `<p><a href="baz*">foo *bar</a></p>`,
   951  		},
   952  		"0.28-gfm-509": {
   953  			Markdown:     "[foo`](/uri)`",
   954  			ExpectedHTML: `<p>[foo<code>](/uri)</code></p>`,
   955  		},
   956  		"0.28-gfm-556": {
   957  			Markdown:     `![foo](/url "title")`,
   958  			ExpectedHTML: `<p><img src="/url" alt="foo" title="title" /></p>`,
   959  		},
   960  		"0.28-gfm-558": {
   961  			Markdown:     `![foo ![bar](/url)](/url2)`,
   962  			ExpectedHTML: `<p><img src="/url2" alt="foo bar" /></p>`,
   963  		},
   964  		"0.28-gfm-559": {
   965  			Markdown:     `![foo [bar](/url)](/url2)`,
   966  			ExpectedHTML: `<p><img src="/url2" alt="foo bar" /></p>`,
   967  		},
   968  		"0.28-gfm-562": {
   969  			Markdown:     `![foo](train.jpg)`,
   970  			ExpectedHTML: `<p><img src="train.jpg" alt="foo" /></p>`,
   971  		},
   972  		"0.28-gfm-563": {
   973  			Markdown:     `My ![foo bar](/path/to/train.jpg  "title"   )`,
   974  			ExpectedHTML: `<p>My <img src="/path/to/train.jpg" alt="foo bar" title="title" /></p>`,
   975  		},
   976  		"0.28-gfm-564": {
   977  			Markdown:     `![foo](<url>)`,
   978  			ExpectedHTML: `<p><img src="url" alt="foo" /></p>`,
   979  		},
   980  		"0.28-gfm-565": {
   981  			Markdown:     `![](/url)`,
   982  			ExpectedHTML: `<p><img src="/url" alt="" /></p>`,
   983  		},
   984  		"0.28-gfm-647": {
   985  			Markdown:     "hello $.;'there",
   986  			ExpectedHTML: "<p>hello $.;'there</p>",
   987  		},
   988  		"0.28-gfm-648": {
   989  			Markdown:     "Foo χρῆν",
   990  			ExpectedHTML: "<p>Foo χρῆν</p>",
   991  		},
   992  		"0.28-gfm-649": {
   993  			Markdown:     "Multiple     spaces",
   994  			ExpectedHTML: "<p>Multiple     spaces</p>",
   995  		},
   996  	} {
   997  		t.Run(name, func(t *testing.T) {
   998  			assert.Equal(t, tc.ExpectedHTML, RenderHTML(tc.Markdown))
   999  		})
  1000  	}
  1001  }
  1002  
  1003  func TestCommonMarkReferenceAutolinks(t *testing.T) {
  1004  	// These tests are adapted from the GitHub-flavoured CommonMark extension tests located at
  1005  	// https://github.com/github/cmark/blob/master/test/extensions.txt
  1006  	for name, tc := range map[string]struct {
  1007  		Markdown     string
  1008  		ExpectedHTML string
  1009  	}{
  1010  		"autolinks-1": {
  1011  			Markdown: `: http://google.com https://google.com
  1012  
  1013  http://google.com/å
  1014  
  1015  www.github.com www.github.com/á
  1016  
  1017  www.google.com/a_b
  1018  
  1019  ![http://inline.com/image](http://inline.com/image)
  1020  
  1021  Full stop outside parens shouldn't be included http://google.com/ok.
  1022  
  1023  (Full stop inside parens shouldn't be included http://google.com/ok.)
  1024  
  1025  "http://google.com"
  1026  
  1027  'http://google.com'
  1028  
  1029  http://🍄.ga/ http://x🍄.ga/`,
  1030  			ExpectedHTML: `<p>: <a href="http://google.com">http://google.com</a> <a href="https://google.com">https://google.com</a></p><p><a href="http://google.com/%C3%A5">http://google.com/å</a></p><p><a href="http://www.github.com">www.github.com</a> <a href="http://www.github.com/%C3%A1">www.github.com/á</a></p><p><a href="http://www.google.com/a_b">www.google.com/a_b</a></p><p><img src="http://inline.com/image" alt="http://inline.com/image" /></p><p>Full stop outside parens shouldn't be included <a href="http://google.com/ok">http://google.com/ok</a>.</p><p>(Full stop inside parens shouldn't be included <a href="http://google.com/ok">http://google.com/ok</a>.)</p><p>&quot;<a href="http://google.com">http://google.com</a>&quot;</p><p>'<a href="http://google.com">http://google.com</a>'</p><p><a href="http://%F0%9F%8D%84.ga/">http://🍄.ga/</a> <a href="http://x%F0%9F%8D%84.ga/">http://x🍄.ga/</a></p>`,
  1031  		},
  1032  		"autolinks-2": {
  1033  			Markdown: `These should not link:
  1034  
  1035  * @a.b.c@. x
  1036  * n@.  b`,
  1037  			ExpectedHTML: `<p>These should not link:</p><ul><li>@a.b.c@. x</li><li>n@.  b</li></ul>`,
  1038  		},
  1039  	} {
  1040  		t.Run(name, func(t *testing.T) {
  1041  			assert.Equal(t, tc.ExpectedHTML, RenderHTML(tc.Markdown))
  1042  		})
  1043  	}
  1044  }