Closed3
markdown-itでURLにアンダースコアが含まれていると自動リンク(linkify)がおかしくなる件
Zennではマークダウンパーサーとしてmarkdown-itを使っているが、URLを自動でリンクへと変換するLinkifyという仕組みでどうしても解決できない問題が発生したのでまとめておく。
_
が含まれているURLが正しく認識されないことがある
アンダースコア 正しく動くケース
例えば、こんな感じで本文にURLを貼る
スクラップの一覧は https://zenn.dev/catnose99/scraps で見れるよ
スクラップの一覧は https://zenn.dev/catnose99/scraps で見れるよ
↑ このようにURLは自動でリンクになる
問題が発生するケース
スクラップの一覧は https://zenn.dev/_catnose99_/scraps で見れるよ
スクラップの一覧は https://zenn.dev/__catnose99__/scraps で見れるよ
スクラップの一覧は https://zenn.dev/catnose99/scraps で見れるよ
スクラップの一覧は https://zenn.dev/catnose99/scraps で見れるよ
↑ URLでアンダースコア _
で囲まれている文字列が強調とみなされてしまい、途中でリンクが途切れてしまう
この問題についてのやり取り
この問題について、markdown-itやmarkdown-itを使っているプロジェクトのリポジトリで何度もIssueが報告されている。
- pydrake doc: Class constructors (
__init__
) have weird ordering? - Linkify terminating url - requires upgrade?
- Markdown syntax transforming valid links
- Linkify doesn't work on valid link
- Auto linking breaks if markdown is in the URL.
で、これらのほとんどが最終的に下記のIssueにリンクが貼られてクローズされている。
最も議論されているIssueの内容を要約すると以下。
-
_some sentence http://example.org/path_bar_
のような強調をされた場合、どこまでがURLなのか判断するのが難しい - URLのプロトコルが
http://
もしくはhttps://
のときだけ(次のwhitespaceまで)アンダースコアを無視しようとするとパフォーマンスが落ちる(実装する場合のアルゴリズム) - markdown-itでは対応しない(この件についてのIssueは全てクローズ)
-
<https://example.org>
のように<
と>
で囲めばその範囲が確実にリンクになるからそれで対応して
結論
つまり結論は以下。
<
>
で囲うことでURLの範囲を指定する
この問題の根本的な解決は望めず、問題が発生したらスクラップの一覧は <https://zenn.dev/_catnose99_/scraps>で見れるよ
スクラップの一覧は https://zenn.dev/_catnose99_/scrapsで見れるよ
ちなみに<
>
で囲んだ範囲がリンクになるのはCommonMarkにも明記されている。
このスクラップは2021/02/18にクローズされました