Sphinx logo

目次

前のトピックへ

チュートリアル: シンプルな拡張を作成

次のトピックへ

新しいビルダーを作成する

このページ

拡張API

それぞれのsphinx拡張は、最低でも setup() 関数を一つ持っている、Pythonモジュールです。この関数は初期化時に一つの引数を伴って呼び出されます。この引数はapplicationオブジェクトで、Sphinxのプロセスに関する情報を持っています。このapplicationオブジェクトは、以下のような公開APIを持っています:

Sphinx.setup_extension(name)
name に与えられた名前を持っている拡張機能をロードします。もしも、作成中の拡張機能が、他の拡張の機能を利用している場合に、このメソッドを使用してください。
Sphinx.add_builder(builder)
新しいビルダーを登録します。 builder 引数は Builder クラスを継承してクラスでなければなりません。
Sphinx.add_config_value(name, default, rebuild)

新しい設定値を登録します。Sphinxが新しい設定値を認識して、関連するデフォルト値を設定するのに必要になります。名前の衝突を回避するために、 name には必ず、拡張機能名を最初に入れてください。 default 値には、Pythonであれば自由に設定することが可能です。 rebuild の値は文字列で、以下の値のうちの一つを取ります。

  • 'env' 設定を変更してからビルドをかけると、環境全体が再ビルドされます。
  • 'html' この設定を変更してからビルドをかけた場合、出力がHTMLの時にフル再ビルドされます。
  • '' 設定を変更してもなにも再ビルドに関しては影響を与えません。

バージョン 0.4 で変更: もしも default の値が呼び出し可能オブジェクトの場合には、設定オブジェクトを引数に渡して呼び出しを行い、デフォルト値を取得します。これは、他の値に依存してデフォルト値を変更したい場合に使用することができます。

バージョン 0.6 で変更: rebuild が単純なブーリアン型('', 'env' に相当)から文字列に変更されました。後方互換性のために、ブーリアン型も受け取ることが可能で、その場合には内部で変換されます。

Sphinx.add_event(name)
Sphinx.add_node(node, **kwds)

Docutilsのノードクラスを登録します。これはDocutils内部で使用するために必要です。将来的にはパースされたドキュメントにおける、ノード検証に使用されるかもしれません。

キーワード引数を使用することで、SphinxのHTMLや、LaTeX, テキストなど、出力形式ごとにノードのビジター関数を与えることができます。キーワードは 'html', 'latex', 'text' のうちの一つ以上で、値としては、ノードに入ったときと出力したときのメソッドをそれぞれ1つずつ含む2要素のタプルを指定します。 depart には、 None を指定可能ですが、この場合は、 visit 関数は docutils.nodes.SkipNode 例外を発生させます。

サンプル:

class math(docutils.nodes.Element)

def visit_math_html(self, node):
    self.body.append(self.starttag(node, 'math'))
def depart_math_html(self, node):
    self.body.append('</math>')

app.add_node(math, html=(visit_math_html, depart_math_html))

もちろん、ビジターメソッドを定義しないトランスレータで実行していて、変換すべきドキュメントに遭遇するとビジターメソッドは沈黙します。

バージョン 0.5 で変更: ビジター関数を、キーワード引数を使って渡すことができるようになりました。

Sphinx.add_directive(name, func, content, arguments, **options)
Sphinx.add_directive(name, directiveclass)

Docutilsのディレクティブを登録します。 name は、ディレクティブ名として今後使っていく名前を設定します。ディレクティブを書く方法には、以下の2通りあります:

  • docutils 0.4スタイル: func がディレクティブ関数で、 content, arguments, *options は関数の属性として設定されます。そして、ディレクティブがコンテンツや引数、オプションを持っているか、それぞれ決定されます。

  • docutils 0.5スタイル: has_content, required_arguments, optional_arguments, final_argument_whitespace, option_spec という、必要な属性を初めから持った、 directiveclass という、ディレクティブのためのクラスで定義します。これらの属性は、関数で登録する方法と同じ役割を持っています。詳しくは、 Docutilsのドキュメント をご覧ください。

    ディレクティブクラスは通常、docutils.parsers.rst.Directiveクラスを継承しなければなりません。Sphinxの拡張機能を作成するために、ディレクティブを書く場合は、sphinx.util.compat.Directiveクラスを継承してください。こちらのクラスであれば、ディレクティブクラスをサポートしていない、Docutils 0.4でも正しく動作します。

例えば、 literalinclude というディレクティブを追加する場合には(既に存在していますが)、以下のように書きます:

from docutils.parsers.rst import directives
add_directive('literalinclude', literalinclude_directive,
              content = 0, arguments = (1, 0, 0),
              linenos = directives.flag,
              language = direcitves.unchanged,
              encoding = directives.encoding)

バージョン 0.6 で変更: Docutils 0.5スタイルのディレクティブクラスがサポートされました。

Sphinx.add_role(name, role)
Docutilsのロールを登録します。 name はドキュメントのソースに表示されるロール名でなければなりません。 role はロールの関数を指定します。詳しくは Docutilsのドキュメント を参照してください。
Sphinx.add_generic_role(name, nodeclass)

Docutilsのロールを登録します。このロールは特に何もしませんが、与えられた nodeclass を使ってラップされるようになります。

バージョン 0.6 で追加.

Sphinx.add_description_unit(ディレクティブ名, ロール名, 索引テンプレート='', パースノード=None, 参照ノードクラス=None)

このメソッドは、クロスリファレンスを作成することができる、新しい情報のタイプを追加することができる便利なメソッドです。このメソッドは以下のことを行います:

  • 新しい 説明ユニット のための、 ディレクティブ名 で指定された名前を持つ、新しいディレクティブを作成します。もしも 索引テンプレート が空でなければ、自動的に索引のエントリーに追加されます。指定されるばあいには、 %s が一つだけ含まれていなければなりません。このテンプレートがどのように解釈されるかについては、この後のサンプルを参照してください。
  • ロール名 で指定された名前を持つ、新しいロールが作成されます。これを使用すると、これらの説明ユニットに対するクロスリファレンスを張ることができます。
  • パースノード を指定する場合には、文字列と、docutilsのノードを受け取る関数を指定しなければなりません。ノードは、その文字列をパースして得られた子供のノードを受け取ります。この関数はクロスリファレンスと索引のエントリーで使用される名前を返さなければなりません。ここの説明のサンプルを見たい場合には、Sphinxのソースコードの ext.py を参照してください。

以下のような関数呼び出しが、カスタムのSphinx拡張の中で行われたとすると:

app.add_description_unit('directive', 'dir', 'pair: %s; directive')

ドキュメント内で以下のようなマークアップが使用できるようになります:

.. directive:: function

   functionの説明。

<...>

:dir:`function` ディレクティブも参照してください

また、このディレクティブを使用すると、以下のようにindexディレクティブを書いたのと同じ索引が作成されます:

.. index:: pair: function; directive

リファレンスノードのクラスは、 参照ノードクラス を指定しない場合には literal になります。このクラスはコードの記述に適したプロポーショナルフォントでレンダリングされます。クラスは、docutilsのノードクラスを設定する必要があります。docutilsのクラスの中で頻繁に使用されるのは docutils.nodes.emphasis あるいは docutils.nodes.strong です。もしも装飾が不要であれば、 docutils.nodes.generated を使用することもできます。

ロールの中身に関しては、標準のSphinxのロールと同じオプションを使用することができます(クロスリファレンス文法 参照)。

Sphinx.add_crossref_type(directivename, rolename, indextemplate='', ref_nodeclass=None)

このメソッドは ディレクティブの出力が必ず空になることを除けば、 add_description_unit() と非常に良く似ています。

これは、セマンティックのターゲットをソースに追加して、カスタムのロールを使用して参照することができるということを意味しています。ただし、 ref のような一般的なものは使用することができません。

サンプル:

app.add_crossref_type('topic', 'topic', 'single: %s', docutils.nodes.emphasis)

使用例:

.. topic:: application API

アプリケーション API
-------------------

<...>

:topic:`このセクション <application API>` を参照してください。

もちろん、 topic ディレクティブに続く要素はセクションでなくてもかまいません。

Sphinx.add_transform(transform)
標準のDocutilsの Transform のサブクラスの transform をtransformのリストに追加します。これはSphinxがreST形式のドキュメントをパースした後に適用されます。
Sphinx.add_javascript(filename)

JavaScriptのファイルのリストに、指定された filename のファイルを追加します。ここで指定されたファイルは、デフォルトのHTMLテンプレートの中にインクルードされます。ファイル名はHTMLの静的パスへの相対パスでなければなりません。詳しくは 設定値のドキュメント を参照してください。

バージョン 0.5 で追加.

Sphinx.add_lexer(alias, lexer)

alias で指定された言語で書かれたコードブロックのハイライトを行う、Pygmentsのレキサークラスのインスタンス lexer を設定します。

バージョン 0.6 で追加.

Sphinx.add_autodocumenter(cls)

sphinx.ext.autodoc 拡張のための新しいドキュメンタークラスとして、 cls クラスを追加します。この引数は sphinx.ext.autodoc.Documenter のサブクラスでなければなりません。これによって、新しいタイプのオブジェクトの自動ドキュメントが可能になります。どのように Documenter のサブクラスを作ればいいのか、というサンプルを参照したい場合には、autodocモジュールのソースコードを参照してください。

バージョン 0.6 で追加.

Sphinx.add_autodoc_attrgetter(type, getter)

組み込みの getattr() 関数と互換性のあるインタフェースを持つ、 getter 関数を追加します。これは type 型のインスタンスのオブジェクトから、自動的に属性を取得してドキュメントを作成するのに使用されます。autodocが型の属性を取得する必要がある場面では、標準の getattr() 関数の代わりに、ここで指定された関数が呼ばれます。

バージョン 0.6 で追加.

Sphinx.connect(event, callback)

event が発行されたときに呼ばれる、 callback を登録します。利用可能なコアイベントと、コールバック関数の引数の詳細情報に関しては Sphinxコアイベント を参照してください。

このメソッドは “リスナーID” を返します。これは disconnect() を呼んで削除する場合の引き数に使用します。

Sphinx.disconnect(listener_id)
listener_id で指定されたコールバックの登録を解除します。
Sphinx.emit(event, *arguments)
event を発行します。コールバック関数には arguments が渡されます。返り値は、すべてのコールバックの返り値がリストに格納されて返されます。拡張機能の中からは、Sphinxのコアのイベントを発行しないでください。
Sphinx.emit_firstresult(event, *arguments)

event を発行します。コールバック関数には arguments が渡されます。最初に None 以外を返したコールバックの返り値を返します。それ以降の残りのコールバックは呼ばれません。

バージョン 0.5 で追加.

exception sphinx.application.ExtensionError
ここで説明したすべての関数は、もし拡張APIの中で何か想定外のことが発生した時には、この例外を投げます。

Sphinx拡張APIの使用法に関するサンプルは、Sphinx標準の sphinx.ext のパッケージの中を見てください。

Sphinxコアイベント

これから説明するイベントがコアイベントです。ここで示した引数は、登録されたイベントハンドラに渡されます。

builder-inited(app)
ビルダーオブジェクトが作成された時に発行されます。ビルダーオブジェクトは app.builder とすることで参照できます。
env-purge-doc(app, env, docname)

ソースファイルが削除されたり、新たに読み込まる場合など、環境の中に含まれるソースファイルの関連情報をクリアすべき状況になった場合に発行されます。環境の属性の中に情報をキャッシュしておくような拡張機能ためのイベントです。

例えば、環境の中にすべてのモジュールのキャッシュが存在してる場合、ソースファイルが変更されると、ファイルからモジュール宣言から削除されてから、そのファイルに関するキャッシュのエントリーはクリアされます。

バージョン 0.5 で追加.

source-read(app, docname, source)

ソースファイルが読み込まれる時に発行されます。 source 引数はリストで、ひとつの要素はソースファイルのコンテンツを表します。コンテンツに関する処理を行ったり、要素に関してソースレベルでの変換を実装したりすることができます。

もしも、LaTeXと同じように、 $ 記号を、インラインの数式の区切り文字にしたい場合には、このイベントハンドラの中で、正規表現を使用して $...$:math:`...` に置き換えることで実現することができます。

バージョン 0.5 で追加.

doctree-read(app, doctree)
doctreeがパースされ、環境から読み込まれ、pickle化される時に発行されます。 doctree をその場で変更することができます。
missing-reference(app, env, node, contnode)

Pythonモジュールやオブジェクトへの相互参照が解決できないときに発行されます。もしも参照の問題を解決できる場合には、 node の代わりにドキュメントツリーに挿入される、新しいdocutilsのノードを返すことで、イベントハンドラ側で解決を行うことができます。通常このノードは、 contnode を子供として含む reference ノードです。

パラメタ:
  • env – ビルド環境(app.builder.env)
  • node – 未解決の、解決すべき pending_xref ノードです。このノードは、参照を解決するために、 reftype, reftarget, modname, classname といった、型とターゲットに関する情報を属性として持ちます。
  • contnode – このノードは、将来の参照が持つ、テキストとフォーマット情報を持ちます。これは返される参照ノードの子供にならなければなりません。
doctree-resolved(app, doctree, docname)

環境がdoctreeに関して”resolved(解決)”と判断したときに発行されます。これは、すべての参照が解決され、目次が挿入された時、ということになります。 doctree はこのイベントハンドラないで操作することができます。

このイベントは、ライタークラスにビジターメソッドが存在しない、カスタムのノードを置換して処理するのに使用することができます。もしもここで設定しない場合、未知のノードを見つけると、ライターはエラーを出しますが、設定することでエラーが出なくなります。

env-updated(app, env)

ビルダーの update() メソッドの実行が完了し、環境とすべてのdoctreeが最新になった時に発行されます。

バージョン 0.5 で追加.

page-context(app, pagename, templatename, context, doctree)

HTMLビルダーがコンテキストの辞書を作り、テンプレートを使用してレンダリングを行う時に発行されます。このイベントは、追加のカスタムの要素をコンテキストに追加する場合に使用することができます。

pagename 引数はレンダリングされるページの、規範に則った名前です。規範というのは、 .html が付かず、パス区切りとしてスラッシュ(/)が使われている状態です。 templatename はレンダリングに使用するテンプレートの名前です。 reSTドキュメントのページのレンダリング時には、必ず 'page.html' となります。

context 引数はテンプレートエンジンがページをレンダリングする際に与えられる値の辞書になります。カスタムの値を持つように、変更することが可能です。キーは必ず文字列です。

doctree 引数はreSTドキュメントから作成する場合にはdoctreeとなります。もしもHTMLテンプレートからのみ作成されるページの場合には、 None となります。

バージョン 0.4 で追加.

build-finished(app, exception)

ビルドが完了し、Sphinxが終了する際に発行されます。通常はクリーンアップに使用されます。このイベントは、ビルドプロセスが例外を上げたときにも発行されます。その場合には、 exception 引数が渡されます。アプリケーションの中で発生した例外は、このイベントハンドラが終了した段階で、再度投げられます。もしもビルドプロセスが例外を発生しなかった場合には、 exceptionNone になります。これによって、例外の種類ごとの、クリーンアップの処理をカスタム化できます。

バージョン 0.5 で追加.

テンプレートブリッジ

class sphinx.application.TemplateBridge

このクラスは、”テンプレートへのブリッジ”をっ定義しています。テンプレートブリッジというのは、与えられたテンプレート名と、コンテキストを利用して、テンプレートをレンダリングするクラスのことです。

init(builder, theme=None, dirs=None)

テンプレートのシステムの初期化を行うために、ビルダーから呼ばれます。

builder はビルダーオブジェクトで、 builder.config.templates_path の値を使用することになるでしょう。

themesphinx.theming.Theme オブジェクト、あるいは None になります。後者の場合には、 dirs に固定ディレクトリのパスが入ったリストが渡され、この中からテンプレートを探します。

newest_template_mtime()
このメソッドはビルダーから呼ばれます。テンプレートが変更されたことで、出力ファイルを再レンダリングする必要があるかどうかの判断をするために使用されます。変更された、最新のテンプレートのmtimeを返します。デフォルトの実装ではゼロを返します。
render(template, context)
指定された context (Python辞書)を使用して、 template で指定されたファイル名のテンプレートのレンダリングを行います。ビルダーから呼ばれます。
render_string(template, context)
指定された context (Python辞書)を使用して、 template で指定された文字列形式のテンプレートのレンダリングを行います。ビルダーから呼ばれます。