# Markdown is broken
I have a lot of scraps of markdown engine oddities that I’ve collected over the
years. What you see below is slightly messy, but it’s what I’ve managed to
cobble together to illustrate the differences between markdown engines, and
why, if there ever is a markdown specification, it has to be absolutely
thorough. There are a lot more of these little differences I have documented
elsewhere. I know I will find them lingering on my disk one day, but until
then, I’ll continue to add whatever strange nonsensical things I find.
Some of these examples may only mention a particular engine compared to marked.
However, the examples with markdown.pl could easily be swapped out for
discount, upskirt, or markdown.js, and you would very easily see even more
inconsistencies.
A lot of this was written when I was very unsatisfied with the inconsistencies
between markdown engines. Please excuse the frustration noticeable in my
writing.
## Examples of markdown’s “stupid” list parsing
“`
$ markdown.pl
* item1
* item2
text
^D
-
item1
- item2
text
“`
“`
$ marked
* item1
* item2
text
^D
-
item1
- item2
text
“`
Which looks correct to you?
– – –
“`
$ markdown.pl
* hello
> world
^D
- hello
world
“`
“`
$ marked
* hello
> world
^D
- hello
world
“`
Again, which looks correct to you?
– – –
EXAMPLE:
“`
$ markdown.pl
* hello
* world
* hi
code
^D
- hello
- world
- hi
code
“`
The code isn’t a code block even though it’s after the bullet margin. I know,
lets give it two more spaces, effectively making it 8 spaces past the bullet.
“`
$ markdown.pl
* hello
* world
* hi
code
^D
- hello
- world
- hi
code
“`
And, it’s still not a code block. Did you also notice that the 3rd item isn’t
even its own list? Markdown screws that up too because of its indentation
unaware parsing.
– – –
Let’s look at some more examples of markdown’s list parsing:
“`
$ markdown.pl
* item1
* item2
text
^D
-
item1
- item2
text
“`
Misnested tags.
“`
$ marked
* item1
* item2
text
^D
-
item1
- item2
text
“`
Which looks correct to you?
– – –
“`
$ markdown.pl
* hello
> world
^D
- hello
world
“`
More misnested tags.
“`
$ marked
* hello
> world
^D
- hello
world
“`
Again, which looks correct to you?
– – –
# Why quality matters – Part 2
“` bash
$ markdown.pl
* hello
> world
^D
- hello
world
“`
“` bash
$ sundown # upskirt
* hello
> world
^D
- hello
> world
“`
“` bash
$ marked
* hello
> world
^D
- hello
world
“`
Which looks correct to you?
– – –
See: https://github.com/evilstreak/markdown-js/issues/23
“` bash
$ markdown.pl # upskirt/markdown.js/discount
* hello
var a = 1;
* world
^D
- hello
var a = 1; - world
“`
“` bash
$ marked
* hello
var a = 1;
* world
^D
- hello
code>var a = 1;
- world
“`
Which looks more reasonable? Why shouldn’t code blocks be able to appear in
list items in a sane way?
– – –
“` bash
$ markdown.js
hello
^D
<div>hello</div>
<span>hello</span>
“`
“` bash
$ marked
hello
^D
hello
“`
– – –
See: https://github.com/evilstreak/markdown-js/issues/27
“` bash
$ markdown.js
[![an image](/image)](/link)
^D
“`
“` bash
$ marked
[![an image](/image)](/link)
^D
“`
– – –
See: https://github.com/evilstreak/markdown-js/issues/24
“` bash
$ markdown.js
> a
> b
> c
^D
a
bundefined> c
“`
“` bash
$ marked
> a
> b
> c
^D
a
b
c
“`
– – –
“` bash
$ markdown.pl
* hello
* world
how
are
you
* today
* hi
^D
-
hello
- world
how
are
you- today
- world
- hi
“`
“` bash
$ marked
* hello
* world
how
are
you
* today
* hi
^D
-
hello
-
world
howare
you -
today
-
- hi
“`