nikkie-ftnextの日記

イベントレポートや読書メモを発信

MyST-Parser は linkify 拡張を有効にすれば <> で囲まないURLもハイパーリンクにできる!

はじめに

七尾百合子さん、お誕生日 164日目 おめでとうございます! nikkieです。

SphinxMarkdown を扱うときの TIL (Today I Learned) です。

目次

SphinxMyST-Parser

ドキュメント変換ツール Sphinx
通常は reStructuredText (reST) で書いた原稿を HTML や PDF(など)に変換します。

MyST-Parser も合わせて使うと、reST 以外に Markdown の原稿も扱えます1
私は『Sphinxをはじめよう 第3版』付録Dで知りました。

さて、MyST-Parser で Markdown も扱えるようになったのですが、ハイパーリンクの記法でひっかかっていた点がありました。

MyST-Parser でのハイパーリンク記法

「Cross-references」のドキュメントの「3. Markdown link syntax」より。
https://myst-parser.readthedocs.io/en/stable/syntax/cross-referencing.html#markdown-link-syntax

  • Autolink: <> で囲む
  • inline links: [link text](URL)
  • Reference links(外部リンクではないので今回は省略)

私がひっかかっていたのは、直書きのURLはハイパーリンクにならないことです。
<>で囲んで Autolink にする必要があります。

またmyst-parserを使ってMarkdownを試したのですが、リンクのサポートが残っています。
<>で囲まないといけないようですね(うーむ)

Linkify 拡張を使えば URL を<>で囲まなくてもいいんです!

このたび Linkify を偶然見つけました。
https://myst-parser.readthedocs.io/en/latest/syntax/optional.html#linkify

conf.py

extensions = [
    "myst_parser",
]
myst_enable_extensions = [
    "linkify",
]
myst_linkify_fuzzy_links = False

Linkify 自体はスキーム2のない(bareな)URL もハイパーリンクにしてくれるのですが、myst_linkify_fuzzy_links=Falseを指定して無効化しています。

なお、Python環境に追加で linkify-it-py が必要です。
myst-parser[linkify]と extra を指定してもインスールできます。

サンプルを用意しました。

### Content 1

* https://ftnext.github.io/sphinx-new-tab-link/guide.html

きっかけは markdown-it

JavaScript のライブラリ markdown-it を見ていて
https://github.com/markdown-it/markdown-it/tree/14.1.0?tab=readme-ov-file#linkify

linkify: true uses linkify-it.

ライブラリがある!

このPythonポートが markdown-it-py

markdown-it-py は linkify-it-py も使います。

そして、MyST-Parser は markdown-it-py を使っているんです!!
https://github.com/executablebooks/MyST-Parser/tree/v4.0.1?tab=readme-ov-file#myst-parser

It contains an extended CommonMark-compliant parser using markdown-it-py

こうして MyST-Parser の linkify の存在を知りました。
ここまでの検索は GPT-5 に助けてもらっています。

終わりに

SphinxMarkdown を使うときにずっとひっかかっていた、直のURLではハイパーリンクにならない点。
MyST-Parser の Linkify 拡張が見事に解決していました👏
私にとっては結構なブロッカーだったので、解決できたのは非常に大きいです!