summaryrefslogtreecommitdiff
path: root/why-cmark-and-not-x.md
blob: 3fdb4e57a901c40788fbd53e83f32929bf0c9c09 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
Why use `cmark` and not X?
==========================

`hoedown`
---------

`hoedown` (which derives from `sundown`) is slightly faster
than `cmark` in our benchmarks (0.21s vs. 0.29s).  But both
are much faster than any other available implementations.

`hoedown` boasts of including "protection against all possible
DOS attacks," but there are some chinks in the armor:

    % time python -c 'print(("[" * 50000) + "a" + ("]" * 50000))' | cmark
    ...
    user 0m0.073s
    % time python -c 'print(("[" * 50000) + "a" + ("]" * 50000))' | hoedown
    ...
    0m17.84s

`hoedown` has many parsing bugs.  Here is a selection (as of
v3.0.3):

    % hoedown
    - one
      - two
        1. three
    ^D
    <ul>
    <li>one

    <ul>
    <li>two</li>
    <li>three</li>
    </ul></li>
    </ul>


    % hoedown
    ## hi\###
    ^D
    <h2>hi\</h2>


    % hoedown
    [ΑΓΩ]: /φου

    [αγω]
    ^D
    <p>[αγω]</p>


    % hoedown
    ```
    [foo]: /url
    ```

    [foo]
    ^D
    <p>```</p>

    <p>```</p>

    <p><a href="/url">foo</a></p>


    % hoedown
    [foo](url "ti\*tle")
    ^D
    <p><a href="url" title="ti\*tle">foo</a></p>


    % ./hoedown
    - one
     - two
      - three
       - four
    ^D
    <ul>
    <li>one

    <ul>
    <li>two</li>
    <li>three</li>
    <li>four</li>
    </ul></li>
    </ul>


`discount`
----------

`cmark` is about six times faster.

`kramdown`
----------

`cmark` is about a hundred times faster.

`kramdown` also gets tied in knots by pathological input like

    python -c 'print(("[" * 50000) + "a" + ("]" * 50000))'