Closed3

markdown-itでURLにアンダースコアが含まれていると自動リンク(linkify)がおかしくなる件

catnosecatnose

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でアンダースコア _ で囲まれている文字列が強調とみなされてしまい、途中でリンクが途切れてしまう

catnosecatnose

この問題についてのやり取り

この問題について、markdown-itやmarkdown-itを使っているプロジェクトのリポジトリで何度もIssueが報告されている。

で、これらのほとんどが最終的に下記のIssueにリンクが貼られてクローズされている。

catnosecatnose

最も議論されている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にクローズされました