Sphinx logo

Table Of Contents

Previous topic

その他のマークアップ

Next topic

利用可能なビルダー

This Page

Sphinxドメイン

New in version 1.0.

ドメインとは何か?

当初、Sphinxは一つのプロジェクトと、Pythonの言語のドキュメントのために作られました。その後少し経って、汎用的なドキュメントツールとして作り直されましたが、Pythonモジュールのドキュメントのため、という部分はツールの奥深くまで根を伸ばしたままでした。 function などのもっとも基本的なディレクティブは、Pythonのオブジェクトのために設計されました。しばらくたって、Sphinxはいくらか人気が出てきて、C/C++のプロジェクト、JavaScript, reStructuredText(このドキュメントのように)など、さまざまな異なる目的で使用したい、という要求が出てきました。

今までも書けないことはありませんでしたが、1.0からは、もっと簡単に、Sphinxでサポートしていない異なるプログラミング言語を使用したプロジェクトのドキュメントでも使える用になりました。 ドメイン という機能がこれを可能にします。

ドメインというのは、説明のためのマークアップ(reStructuredTextの ディレクティブロール)と、プログラミング言語の構成部品と関連する オブジェクト へのリンクによってできています。ドメインに属するディレクティブとロール名は py:function などのように、 ドメイン:名前: という名前を持ちます。ドメインを使って、Pythonのモジュール索引のような、専用の索引を作成することもできます。

ドメインがあるということは、C++とPythonの両方のクラスに言及したいようなドキュメントを書く場合でも、名前が衝突する問題がない、ということです。まったく新しい言語のドキュメントをサポートするのも簡単になります。

このセクションでは、Sphinxのドメインが何を提供するのか、ということを説明していきます。ドキュメントAPIの説明は ドメインAPI で説明します。

マークアップの基礎

ほとんどのドメインは、いくつかの object description directives を提供しています。これを使って、モジュールが提供する特定のオブジェクトについて説明をしていきます。それぞれのディレクティブでは、何について説明しているか、説明すべき内容などの基本情報のためのフォーマットや統一のルールを定めています。基本的なスタイルのディレクティブは、全体の索引に、説明対象へのリンクを追加しますが、もし索引に追加したくなければ、ディレクティブのオプションフラグに :noindex: を追加します。例えば、Pythonのドメインのディレクティブの場合には、次のようになります:

.. py:function:: spam(eggs)
                 ham(eggs)
   :noindex:

   Spam or ham the foo.

ドメインは、オブジェクトへのリンクを張るためのロールも提供します。例えば先ほどのサンプルの関数説明にリンクを張るためには、次のように書きます:

関数 :py:func:`spam` は同じ処理を行います。

このように、ディレクティブとロール名の両方とも、ドメイン名とディレクティブ名の2つから構成されています。

デフォルトドメイン

もし、Pythonしか登場しないプロジェクトで、Pythonオブジェクトの説明しか書かない場合に、ドメイン名を毎回書かなくても良いようにする機能が提供されています。 primary_domain 設定値と、専用のディレクティブの2つの方法で、デフォルトのドメインを指定できるようになっています。

.. default-domain:: name

新しいデフォルトのドメインを設定します。 primary_domain はプロジェクト全体のデフォルトを決定しますが、このディレクティブは同じファイル内にのみ影響を与えます。

もしもデフォルトが設定されないと、Pythonドメイン(py)がデフォルトになります。これは、過去のバージョンのSphinxで書かれたドキュメントと互換性があります。

デフォルトドメインに属するディレクティブとロールを書く場合には、ドメイン名を入れる必要はありません:

.. function:: pyfunc()

   Pythonの関数の説明

:func:`pyfunc` への参照。

クロスリファレンス文法

汎用的なクロスリファレンスのために使用されるのと同じような機能を持つ、クロスリファレンスのためのロールが、ドメインによって提供されます。詳しくは クロスリファレンス文法 を参照してください。

簡単に説明すると:

  • 明示的なリンク名と、リンクターゲットを指定できます。 :rst:role:`タイトル <ターゲット>` と書くと、 ターゲット を参照しますが、リンクテキストは タイトル になります。
  • もしも先頭に ! が付けられると、ハイパーリンクや参照は作成されません。
  • もし、先頭に ~ が付けられると、ターゲットの最後の項目だけがリンクテキストになります。例えば、 :py:meth:`~Queue.Queue.get` と書かれると、 Queue.Queue.get を参照しますが、リンクテキストとして表示されるのは、 get だけになります。

Pythonドメイン

Pythonドメイン(py)では、モジュールの説明のために、次のようなディレクティブを提供しています:

.. py:module:: 名前

このディレクティブはモジュールの説明の開始時に使用します。パッケージやサブモジュールにも使用できますが、この場合はパッケージ名を含む、完全な名前を指定してください。この ディレクティブは py:class ディレクティブのようなコンテンツを作成することはできません。

このディレクティブを使用すると、グローバルなモジュール索引に項目が追加されます。

platform オプションが存在していれば、そのモジュールが利用可能なモジュールをカンマ区切りで指定します。もしすべてのプラットフォームで利用可能であれば、このオプションは使用しないようにしましょう。プラットフォーム名としては、短い識別子、例えば、”IRIX”, “Mac”, “Windows”, “Unix”などから利用してください。もし適用時点ですでに使用されているキーがあれば、それを使用してください。

synopsis オプションには、モジュールの目的を説明する文章を書くことができます。現在のバージョンでは、これはグローバルモジュールインデックスの中でのみ使用されます。

deprecated オプションを使用すると、このモジュールが古くて、使用するのを推奨しない、ということを示すことができます。オプションは取りません。このディレクティブは様々な場所で使用されるでしょう。

.. py:currentmodule:: 名前

このディレクティブはSphinxに対して、この行以降のクラスや関数などが、指定された与えられたモジュール (py:module のように)の中にある、ということを通知します。これを使用しても、索引のエントリーは作成されません。 mod へのリンクターゲットも作成されません。このディレクティブは、モジュールに含まれる項目へのドキュメントが様々なファイルやセクションに分割されている場合に便利です。この場合には一カ所だけ py:module ディレクティブを使用して、他の箇所で py:currentmodule を使用するようにします。

モジュールとクラスの中の構成要素を記述するために、次のようなディレクティブが提供されています:

.. py:data:: データ名

モジュール内のグローバルなデータの説明をします。変数も値も”定義された定数”として取り込むことができます。クラスとオブジェクトの属性はこの環境を使用してドキュメントを書くことはできません。

.. py:exception:: 例外名

例外クラスの説明をします。シグニチャには、コンストラクタの引数を括弧付きで含めることもできますが、しなくてもかまいません。

.. py:function:: 関数名(シグニチャ)

モジュールレベル関数の説明です。シグニチャはパラメータを含めます。オプションのパラメータに対してはカッコでくくります。分かりやすさを上げる目的でデフォルト値を入れることもできます。 Pythonシグニチャ の説明も参照してください。サンプル:

.. py:function:: Timer.repeat([repeat=3[, number=1000000]])

オブジェクトのメソッドはこのディレクティブではドキュメントを記述することはできません。モジュールの名前空間にあり、モジュールの公開インタフェースとして作成されているメソッドに限って使用することができます。これらは通常の関数とほぼ同じように使用できます。

説明にはパラメータに必要な関する情報と、それらがどのように使用されるのか(変更可能なオブジェクトが渡されたときに、変更されるのかどうか)、副作用、投げられる可能性のある例外の情報を含まなければなりません。小さいサンプルが提供されるでしょう。

.. py:class:: クラス名[(シグニチャ)]

クラスについて説明します。シグニチャにはコンストラクタ引数になるパラメータも含めることができます。 Pythonシグニチャ も参照してください。

このクラスに属する属性とメソッドのディレクティブはこのディレクティブの本体の中に記述します。このクラスの外に書いた場合は、提供された名前にクラス名が含まれていれば、クロスリファレンスは動作します。サンプル:

.. class:: Foo
   .. method:: quux()

-- あるいは --

.. class:: Bar

.. method:: Bar.quux()

最初の書き方が推奨です。

.. py:attribute:: 属性名

オブジェクトの属性のデータの説明をします。この説明には期待されるデータの型、値を直接変更することができるかどうか、という情報を含めます。

.. py:method:: メソッド名(シグニチャ)

オブジェクトのメソッドの説明をします。パラメータからは self パラメータははずします。この説明には function と同じ情報を記述するようにします。 Pythonシグニチャ も参照してください。

.. py:staticmethod:: メソッド名(シグニチャ)

py:method とほぼ一緒ですが、メソッドがスタティックメソッドであるということを表します。

New in version 0.4.

.. py:classmethod:: メソッド名(シグニチャ)

py:method とほぼ一緒ですが、メソッドがクラスメソッドであるということを表します。

New in version 0.6.

Pythonシグニチャ

関数やメソッド、クラスのコンストラクタのシグニチャは、オプションパラメータにカッコを使うのを除き、Pythonで書くように記述することができます:

.. py:function:: compile(source[, filename[, symbol]])

このような省略可能な引数を表す場合には、慣習的にカンマの前に開きカッコを置きます。省略できる引数が二つ以上ある場合には、カッコを入れ子にするスタイルと、フラットにするスタイルの両方があります。このような場合にはほとんどの場合、オプションの引数は個別に与えることができます:

.. py:function:: compile(source[, filename, symbol])

オプション引数のデフォルト値を与えることもできます。ただし、値にカンマが含まれると、シグニチャのパーサはうまく動作しません。Pythonの3つのスタイルの引数のアノテーションと同様に、返り値の型も記述することができます:

.. py:function:: compile(source : string[, filename, symbol]) -> ast object

詳細情報フィールドのリスト

New in version 0.4.

Pythonのオブジェクト説明のためのディレクティブの内側には、適切に情報が明示されて、決まったルールに従ったreSTフィールドを配置することができます:

  • param, parameter, arg, argument, key, keyword: 引数の説明です。
  • type: 引数のタイプです
  • raises, raise, except, exception: この中から投げられる例外(いつ投げられるか?)を定義します
  • var, ivar, cvar: 変数の説明をします
  • returns, return: 返り値の値について説明をします
  • rtype: 返り値の型です。

フィールドは、 return, rtype 以外の場合は、上記のキーワードのうち、どれかと、引数を一つが引数として設定されています。 return, rtype だけは引数を取りません。サンプルを見ていただくのが一番でしょう:

.. function:: format_exception(etype, value, tb[, limit=None])

   トレースバック付きで、例外を人の読める形式にフォーマットします。

   :param etype: 例外のタイプ
   :param value: 例外オブジェクト
   :param tb: トレースバックオブジェクト
   :param limit: 表示するスタックフレームの数の最大数
   :type limit: 数値 or None
   :rtype: 文字列のリスト

型情報が一語で表せる場合には、属性の型と説明をひとつにまとめることもできます:

:param integer limit: 表示するスタックフレームの数の最大数

これは次のようにレンダリングされます:

format_exception(etype, value, tb[, limit=None])

トレースバック付きで、例外を人の読める形式にフォーマットします。

Parameters:
  • etype – 例外のタイプ
  • value – 例外オブジェクト
  • tb – トレースバックオブジェクト
  • limit (数値 or None) – 表示するスタックフレームの数の最大数
Return type:

文字列のリスト

Pythonオブジェクトのクロススリファンレス

以下のロールを使用すると、モジュール内のオブジェクトを参照することができます。一致する識別子が見つかれば、ハイパーリンクが作成されます:

:py:mod:

モジュールへの参照です。ドットで区切られた名前も使用できます。これはパッケージ名としても利用可能です。

:py:func:

Pythonの関数への参照です。ドットで区切られた名前も使用できます。ロールのテキストは読みやすさのために括弧を後ろに含める必要はありません。 add_function_parentheses 設定値をtrue(デフォルト)にしておくと、Sphinxが自動で括弧を追加します。

:py:data:

モジュール変数を参照します。

:py:const:

定義済みの定数への参照です。これはC言語の #define や、 Pythonで変更されることのない変数に使います。

:py:class:

クラス名です。ドットで区切られた名前も使用できます。

:py:meth:

オブジェクトのメソッドへの参照です。ロールのテキストには型名とメソッド名を含めなければなりません。ただし、型の記述中に書く場合には省略することもできます。ドットで区切られた名前も使用できます。

:py:attr:

オブジェクトの属性への参照です。

:py:exc:

例外への参照です。ドットで区切られた名前も使用できます。

:py:obj:

型が指定されていないオブジェクトの名前です。 default_role 一緒に使用すると便利です。

New in version 0.4.

このマークアップの中の名前には、モジュール名, クラス名なども含めることができます。例えば、 :py:func:`filter` は現在のモジュールに定義されている filter という名前の関数か、その名前を持つ組み込み関数をあらわします。 :py:func:`foo.filter` と明示的に書くと、 foo モジュールの中の filter 関数を表します。

通常、これらのロールで使用される名前は、最初は修飾子なしで検索されます。次に現在のモジュール名を前に付けて検索されます。その次に現在のモジュール名とクラス名(あれば)を付けて検索されます。もし、ドットが先頭についた名前が指定された場合には、この探索順は逆になります。例えば、 codecs というPythonモジュールの定義の中で :py:func:`open` が定義されると、常に組み込み関数を参照しますが、 :py:func:`.open` と書かれると、 codecs.open() を参照するようになります。

また、名前の前にドットがついていて、正確に一致するものがないと、ドットを外した名前を持つオブジェクトと、その名前を末尾に含むすべてのオブジェクトが検索されます。例えば、 :py:meth:`.TarFile.close` という文字列は、現在のモジュールが tarfile でなかったとしても、 tarfile.TarFile.close() を見つけ出して参照します。もしも該当するオブジェクトが複数ある場合には、どれを参照すればいいのか一意に定まらないため、Sphinxは警告を出します。

属性名が、現在のクラスのものかどうかを決定するのにも、同様の名前検索の仕組みが使用されます。

C言語ドメイン

C言語ドメイン(c)はC言語のAPIのドキュメントを書くのに適しています。

.. c:function:: 型 関数名(シグニチャ)

Cの関数の説明に使用します。シグニチャはC言語内で書かれる様に記述します。例えば以下のように書きます:

.. c:function:: PyObject* PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)

これは、関数のようなプリプロセッサマクロにも使用することができます。説明の中で使用されることもあるため、引数名も書く必要があります。

シグネチャ内のアスタリスクはバックスラッシュでエスケープする必要はありません。この中はreSTの行内のテキスト処理のパーサは実行されず、専用のパーサで処理されます。

.. c:member:: 型 構造体メンバー名

C言語の構造体メンバーの説明をします。以下のように記述します:

.. c:member:: PyObject* PyTypeObject.tp_bases

説明のテキストには受け入れ可能な値の範囲、値がどのように解釈されるべきか、値が変更可能かどうかという情報を入れるべきです。構造体のメンバーへの参照をテキストの中で書きたい場合には、 member ロールを使用すべきです。

.. c:macro:: マクロ名

シンプルなC言語のマクロの説明をします。シンプルなマクロというのは、単純なコード展開だけをするもので、引数を取らないものです。また、単純な定数定義にも使用しません。このディレクティブのサンプルを見るには、Pythonドキュメントの PyObject_HEAD, Py_BEGIN_ALLOW_THREADS を参照してください。

.. c:type:: 型名

C言語の型名を説明します。型というのは、typedefかstructで定義されるものです。シグニチャには型名を指定します。

.. c:var:: 型 変数名

グローバルなC言語の変数について説明します。シグニチャは型を含む必要があります。次のように記述します:

.. c:var:: PyObject* PyClass_Type

C言語の要素へのクロスリファレンス

以下のロールは、もしドキュメントの中に定義の説明があれば、C言語の要素へのクロスリファレンスを作成します:

:c:data:

C言語の変数への参照です。

:c:func:

C言語の関数への参照です。カッコを省略することはできません。

:c:macro:

前の説明で述べた、シンプルなC言語のマクロへの参照です。

:c:type:

C言語の型への参照です。

C++ドメイン

C++ドメインは(cpp)は、C++プロジェクトのドキュメント作成をサポートします。

次のようなディレクティブが利用可能です:

.. cpp:class:: シグニチャ
.. cpp:function:: シグニチャ
.. cpp:member:: シグニチャ
.. cpp:type:: シグニチャ

C++オブジェクトの説明をします。完全なシグニチャ定義をサポートしています。C++の宣言部で使用するようにシグニチャを書くことができます。いくつかサンプルを提示します:

.. cpp:function:: bool namespaced::theclass::method(int arg1, std::string arg2)

   パラメータと型情報付きのメソッドの説明です。

.. cpp:function:: bool namespaced::theclass::method(arg1, arg2)

   型情報なしのメソッドの説明です。

.. cpp:function:: const T &array<T>::operator[]() const

   テンプレート配列のconstのインデックス操作メソッドの説明です。

.. cpp:function:: operator bool() const

   これはキャスト演算子の説明です。

.. cpp:member:: std::string theclass::name

.. cpp:type:: theclass::const_iterator

これらのディレクティブは、次のようにレンダリングされます:

bool namespaced::theclass::method(int arg1, std::string arg2)

パラメータと型情報付きのメソッドの説明です。

bool namespaced::theclass::method(arg1 None, arg2 None)

型情報なしのメソッドの説明です。

const T& array<T>::operator[]() const

テンプレート配列のconstのインデックス操作メソッドの説明です。

operator bool() const

これはキャスト演算子の説明です。

std::string theclass::name
type theclass::const_iterator
.. cpp:namespace:: 名前空間

ドキュメントの中で、この行以降で説明するオブジェクトが所属するC++の名前空間を選択します。

このドメインは次のようなオブジェクトの種類へのロールを提供しています:

:cpp:class:
:cpp:func:
:cpp:member:
:cpp:type:

C++オブジェクトへの参照です。完全なシグニチャを指定することができます。オーバーロードされた関数へのリンクを張る場合には、完全なシグニチャを指定する必要があります。

参照に関する注意点

現在の実装では、オーバーロードされた特定のメソッドに対してリンクを張ることはできません。C++ドメインは、オーバーロードされたメソッドを持つ言語をサポートする最初のドメインです。きちんとそれぞれのメソッドを比較できるようなデータ構造を持つまでは、特定のメソッドを参照するために見難い構文を導入するのは避けたいと考えています。現在のSphinxでは、オーバーロードされた最初のメソッドや関数をリンクしに行きます。

標準ドメイン

標準ドメインには、固有のドメインを作るまでもないすべてのマークアップが含まれます。これらのディレクティブやロールには、ドメイン名のプリフィックスは付きません。

標準ドメインには、 add_object_type() APIを使って追加されたカスタムの説明ディレクティブ、ロールも含まれます。

現在は、コマンドラインのプログラムを説明するためのディレクティブ群が提供されています:

.. option:: 名前 引数, 名前 引数, ...

コマンドラインオプションやスイッチの説明をします。オプションの引数名は不等号でくくる必要があります:

.. option:: -m <モジュール>, --module <モジュール>

   モジュールをスクリプトとみなして実行します

このディレクティブは 最初 のオプションを名前付きのターゲットとみなして、クロスリファレンスを作成します。これは option にて参照可能です。このサンプルの場合は、 :option:`-m` という形式でリンクを張ることができます。

.. envvar:: 名前

現在ドキュメントの対象ととなっているコードやプログラムが使用したり、定義する環境変数について説明します。 envvar というロールを使って参照することができます。

.. program:: 名前

py:currentmodule と同様に、このディレクティブは何も出力しません。その代わりにこのディレクティブを定義すると、Sphinxはこの後に定義される option ディレクティブが説明するオプションが、ここで指定された 名前 を持つプログラムに属するということを認識できるようになります。

program を使用する場合には、 option ロールとプログラム名を適合させる必要があります。以下のような状況について見てみます:

.. program:: rm

.. option:: -r

   再帰的に動作するようになります

.. program:: svn

.. option:: -r revision

   作業中のワークに対してリビジョンを設定します

この場合、 option`rm -r` 最初のオプションを示し、 option:`svn -r` は2番目のオプションを示します。

プログラム名はスペースを含むこともできます。そのため、 svn add や、 svn commit などのサブコマンドを個別に取り扱いたい、というケースにも対応できます。

New in version 0.5.

どこのドメインにも属さないような、非常に汎用的なオブジェクトの説明用のディレクティブも存在します:

.. describe:: テキスト
.. object:: テキスト

このディレクティブはドメインで提供されているディレクティブを使ったのと、同じ形式にフォーマットされたテキストを生成します。その代わり、インデックスのエントリーや、クロスリファレンスのターゲットは作成されません:

.. describe:: PAPER

   この変数を定義すると、用紙サイズを変更することができます。

JavaScriptドメイン

JavaScriptドメイン(js)は次のようなディレクティブを提供します:

.. js:function:: 名前(シグニチャ)

JavaScriptの関数やメソッドの説明をします。オプショナルな引数を説明したい場合には、Pythonシグニチャのために 説明したように 角カッコを使用します。

引数や期待される型、関数から投げられるエラー、returnで返される値などのフィールド情報の詳細を書くこともできます:

.. js:function:: $.getJSON(href, callback[, errback])

   :param string href: リソースのある場所を示すURI
   :param callback: GETの応答が帰ってきたときに呼ばれるオブジェクトを受け取るコールバック
   :param errback:
       リクエストにエラーが発生したときに、呼ばれるコールバック。
       このように多くの情報が必要なら複数行にかけて書くこともできます。
   :throws SomeError: エラーが発生する理由
   :returns: 何か

次のようにレンダリングされます:

$.getJSON(href, callback[, errback])
Arguments:
  • href (string) – リソースのある場所を示すURI
  • callback – GETの応答が帰ってきたときに呼ばれるオブジェクトを受け取るコールバック
  • errback – リクエストにエラーが発生したときに、呼ばれるコールバック。 このように多くの情報が必要なら複数行にかけて書くこともできます。
Throws SomeError:
 

エラーが発生する理由

Returns:

何か

.. js:class:: 名前

オブジェクトを作るコンストラクタの説明をします。基本的には関数と似ていますが、 class という文字が表示されます:

.. js:class:: MyAnimal(name[, age])

   :param string name: 動物の名前
   :param number age: 動物の年齢(オプション)

これは次のようにレンダリングされます:

class MyAnimal(name[, age])
Arguments:
  • name (string) – 動物の名前
  • age (number) – 動物の年齢(オプション)
.. js:data:: 名前

グローバル変数や定数の説明です。

.. js:attribute:: オブジェクト.属性名

オブジェクト の持つ 属性名 を説明します。

このドメインでは、オブジェクトの説明を参照する、次のようなロールが提供されています:

:js:func:
:js:class:
:js:data:
:js:attr:

reStructuredTextドメイン

reStructuredTextドメイン(rst)は、次のようなディレクティブを提供します:

.. rst:directive:: name

reSTディレクティブの説明をします。 name には単独のディレクティブ名か、引数付きの実際のディレクティブの文法(.. を前に付けたり、後ろに :: を付けたり)で記述をします。

サンプル:

.. rst:directive:: foo

   Fooの説明

.. rst:directive:: .. bar:: baz

   Barの説明

これは次のようにレンダリングされます

.. foo::

Fooの説明

.. bar:: baz

Barの説明

.. rst:role:: name

reSTのロールの説明をします。

サンプル:

.. rst:role:: foo

   Fooの説明

次のようにレンダリングされます:

:foo:

Fooの説明

説明したオブジェクトを参照するために、次のようなロールが提供されます:

:rst:dir:
:rst:role:

追加のドメイン

sphinx-contrib リポジトリに、拡張機能として利用可能なドメインがいくつかあります。現在はRubyとErlangのドメインがあります。