nikkie-ftnextの日記

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

外部リンクにアイコンを添えて表示できる設定値を画像のtargetオプションにも対応させるバグ修正をした sphinx-new-tab-link 0.5.2 をリリースしました🦋

はじめに

伊吹翼さん、お誕生日おめでとうございます!🎉🎂 nikkieです。アイルううううう

リリース報告エントリです。
タイトルの「sphinx-new-tab-linkとはなんだろう」という方は、以下の記事をまずどうぞ!

目次

reSTには画像を埋め込むディレクティブが2つあります

  • figure
  • image(こちらがインライン画像)

これらのディレクティブについて:target:オプションを指定することで、画像をリンクにできることを知りました。

SphinxでビルドしたHTMLの外部リンクをブラウザの新しいタブで開くようにする自作拡張sphinx-new-tab-linkは、(デフォルト設定では)リンクにした画像にも対応しています。
画像をクリックすると、別のタブでリンク先URLが開きます。

画像のリンクをサポートしていることは今後ガイドで確認できます。

外部リンクにアイコンを添える機能を有効にすると、画像のリンクにバグがありました

sphinx-new-tab-linkは 0.5.0 から、外部リンクにアイコンを添える設定値を追加しました。
conf.pynew_tab_link_show_external_link_icon = True と設定します。

この設定値と画像のリンクにバグ報告をいただきました(ありがとうございます!)

このバグを修正しました!🐛👋

  • imageディレクティブ:v0.5.1でバグ修正をリリース
    • バグを再現するテストを書いて通るように修正
  • figureディレクティブ:発生していないことを確認(v0.5.2としてリリース)

https://pypi.org/project/sphinx-new-tab-link/0.5.2/

修正を機に、設定値と画像のリンクの扱いについて、レシピ集で例として示すようにしました。

バグの原因は、リンク(docutilsのreferenceノード)の子にはTextしか来ないと誤って思い込んでいたことです。

# https://github.com/ftnext/sphinx-new-tab-link/blob/v0.5.0/src/sphinx_new_tab_link/__init__.py#L30-L31
node[0] = Text(node[0].astext() + " ")
node.append(raw(text=external_link_icon_html(), format="html"))

node[0](子)がimageやfigureディレクティブの場合はastext()メソッドは空文字列を返します
そのためにnew_tab_link_show_external_link_iconを有効にしたときに、ディレクティブで表示したい画像が落ちてしまいます。

子にはText以外も来ることを考慮し、子の最後に追加(append)するように修正しました

# https://github.com/ftnext/sphinx-new-tab-link/blob/v0.5.1/src/sphinx_new_tab_link/__init__.py#L30-L31
node.append(Text(" "))
node.append(raw(text=external_link_icon_html(), format="html"))

この実装に変えたところ、テストコードが全部通ったので修正できたと判断しています(バグを再現するテストが落ちなくなった=修正できた。加えて回帰テストもパス)

終わりに

sphinx-new-tab-link 0.5.2のリリース報告でした。
issueをきっかけに知らなかったことが知れたので、アウトプットする者に情報が集まった例だなあと感じています。
使ってくださり、issueまで上げてくださり、ありがとうございます!

SphinxでビルドしたHTMLの中の外部リンクをブラウザの新しいタブで開きたい」方はよろしければお試しください(pip install sphinx-new-tab-link)。
触ってみた感想(よかったも伸びしろも)や、「こういうユースケースで使いたいんだけどサポートしてくれないか」といった要望、そしてリポジトリへのスターも、お待ちしています!

応援ください