xoofx / markdig

A fast, powerful, CommonMark compliant, extensible Markdown processor for .NET
BSD 2-Clause "Simplified" License
4.41k stars 456 forks source link

Unable to parse relative URL to parent directories #819

Open AmadeusW opened 1 month ago

AmadeusW commented 1 month ago

I'm writing a Markdown renderer that formats user .md files into navigable .html pages. Some user documents contain relative paths to a parent directory, like these:

[example link](..\example.md)
[example link](\..\example.md)

Currently, LinkHelper.TryParseInlineLink calls LinkHelper.TryParseInlineLink, which calls LinkHelper.TryParseUrl leaving isAutoLink unset as false. This means that TryParseUrl treats the slash as escape character and effectively removes it. The character is not recorded as a part of trivia, and there's no way to infer its presence by examining the AST.

Setting isAutoLink to true seems to address this issue, but I don't know what auto link is, and whether this is an appropriate wokaround. I was thinking about a solution where we'd set a property on InlineProcessor.MarkdownPaserContext to influence LinkInlineParser.TryProcessLinkOrImage, but would like to get your opinion before making code changes.

AmadeusW commented 1 month ago

@xoofx I'd appreciate your opinion how to best fix this, or how to override the behavior of LinkInlineParser

xoofx commented 1 month ago

I would use / instead of \ and you wouldn't have to change the parser:

[example link](../example.md)
[example link](/../example.md)

None of the CommonMark parser are supporting \ in that case and they all trim it in the same way here

jefflomax commented 1 day ago

While I do not recommend it - I pre-parsed markdown to rewrite the links to the standard, then passed that to this wonderful library. It's a pain, if you can get escaped unix style paths that's better.