程序代写代做代考 # Markdown is broken

# 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

hello
^D

<div>hello</div>

<span>hello</span>

“`

“` bash
$ marked

hello

hello
^D

hello

hello

“`

– – –

See: https://github.com/evilstreak/markdown-js/issues/27

“` bash
$ markdown.js
[![an image](/image)](/link)
^D

![an image

“`

“` bash
$ marked
[![an image](/image)](/link)
^D

an image

“`

– – –

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
  • hi

“`

“` bash
$ marked
* hello
* world
how

are
you

* today
* hi
^D

  • hello

    • world
      how

      are
      you

    • today

  • hi

“`