サイトの外部リンクを別窓にする for Sphinx
ちょっと
Sphinx(rST)におけるリンクの考え方
Sphinxでの
それぞれのreference
と
SphinxのHTMLビルドにおいて、リンク=a要素はどのように生成されるか
Sphinxで
html
ビルドを用いて StandaloneHTMLBuilder
による ビルドを 実行 ビルダーは
出力の ための 各種準備を 行い、 HTML5Translator
という ライターに 出力を 委譲
HTML5Translator
には、visit_xxxx
, depart_xxxx
と
今回のreference
ノードです。visit_reference
とa
要素を
処理を継ぎ足して、無理矢理外部リンク化する
現在では、a
要素には、target="_blank"
だけでなくrel="noreferer"
をHTML5Translator.visit_reference
のrel
属性の
その
def visit_reference(self, node):
atts = {"class": "reference"}
if node.get('internal') or 'refuri' not in node:
atts['class'] += ' internal'
else:
atts['class'] += ' external'
# overwritten
atts['target'] = '_blank'
atts["rel"] = "noreferrer"
もともとのHTML5Translator.visit_reference
が
from sphinx.writers.html5 import HTML5Translator
# 中略
def setup(app):
app.add_node(
reference, True, html=(visit_reference, HTML5Translator.depart_reference)
)
reference
ノードに
これで、target="_blank"
等が
ライブラリ化を躊躇している理由
それなりに
この
テスト・構造を
一切度 外視して 結果 のみを 優先したので、 想定外の ケースへの 対処を 何も していない も
う ちょっと マシな 実装が ありそうな 気が する (コードの コピペ実装すぎるので、 堅牢性が なさすぎる ) 優先順位が
低い
「マシな
※脚注