evilstreak / markdown-js

A Markdown parser for javascript
7.69k stars 863 forks source link

Errorneous link_ref #80

Closed mishoo closed 11 years ago

mishoo commented 11 years ago

This text: foo [bar] baz parses as:

[ 'markdown',
  [ 'para',
    'foo ',
    [ 'link_ref', { ref: 'bar', original: '[bar]' }, 'bar' ],
    ' baz' ] ]

The original markdown outputs <p>foo [bar] baz</p> which is more like what I'd expect—it's not really a link. I can't find the single [foo] as valid syntax in the Markdown spec, so I assume this is a bug...

ashb commented 11 years ago

This is what the MD JsonML to HTML converter will output as well.

Link references are commonly put at the end of a document or section, so the parser needs to create ref-links as it goes along, and when converting at the end if no reference is found it is output as a literal [bar]:

foo [bar]

[bar]: http://www.google.com

Compare outputs here: http://babelmark.bobtfish.net/?markdown=foo+[bar]%0D%0A%0D%0A[bar]%3A+http%3A%2F%2Fwww.google.com

This comes down to the wonderful fact that markdown doesn't have a formal specification.

mishoo commented 11 years ago

I agree it should be linked if there's a [bar]: link-definition somewhere, but it should be left alone otherwise. Most converters in the page you pointed out seem to agree on this.

Perhaps the smarter move would be to scan for link definitions first, and add link_ref only for defined links. I suppose it's not easily doable though.. :-(

evilstreak commented 11 years ago

The HTML output for foo [bar] baz is <p>foo [bar] baz</p>.

We use two intermediary formats to make customisation and extension easier: Markdown -> JsonML (Markdown) -> JsonML (HTML) -> HTML. The link_ref is converted into plain text on the second step, when it becomes JsonML (HTML). Doing it in the first step would be a pain, and could hurt extensibility around link definitions.

mishoo commented 11 years ago

The HTML output for foo [bar] baz is

foo [bar] baz

.

Yep, got that, but it's the tree form what I care about here. I'm using markdown-js to parse some API documentation and the JsonML format is pretty good for working with it.

Well, nevermind, I'll just fix up the tree on my own in this case...